İçine birçok bağlantıları olan bir model var: Bu modellerinYuvalanmış serializörlerden model oluşturmadan Serializer aracılığıyla model örneğini nasıl oluşturabilirim?
class Travel(BaseAbstractModel):
tags = models.ManyToManyField(
Tag,
related_name='travels',
)
owner = models.ForeignKey(
'users.TravelUser',
related_name='travel_owner'
)
payment = models.ForeignKey(
Payment,
related_name='travels',
)
country = models.ForeignKey(
Country,
related_name='travels,
)
........
Birçok benzersiz isim ve görüntü ile sadece iki alan var. Ben bu modellerin her biri için seri hale oluşturmak ve dokümanlar dayanarak ben create()
ve update
geçersiz TravelSerializer
class TravelBaseSerializer(DynamicFieldsModelSerializer):
owner = UserSerializer(required=False)
tags = TagSerializer(many=True)
payment = PaymentSerializer()
country = CountrySerializer()
koyun.
Sorun, JSON verilerini gönderdiğimde, Django her modeli iç içe seri hale getiricilerden oluşturur. Ancak sadece Travel
örneğini oluşturmak istiyorum. Ayrıca sadece pk
alanını değil seri hale getirilmiş nesneyi almak ve yanıtlamak istiyorum.
GÜNCELLEME
Ben, bu sorunu çözmüş yanıtında kodu koydu. Artık nesne oluşturmadan Serializer verilerini alıp yanıtlayabiliyorum. Ama DRF'nin daha zarif bir yaklaşım sağladığını düşünüyorum. DRF ile ilk projem, belki bir şeyi özlüyorum ve daha kolay bir çözüm var.
class NestedRelatedSerializer(serializers.ModelSerializer):
def to_internal_value(self, data):
try:
pk = data['pk']
except (TypeError, KeyError):
# parse pk from request JSON
raise serializers.ValidationError({'_error': 'object must provide pk!'})
return pk
ondan tüm pk
alın ve create
ve updated
yöntemlerde kaydetmek: Ben
def update(self, instance, validated_data):
# If don't get instance from db, m2m field won't update immediately
# I don't understand why
instance = Travel.objects.get(pk=instance.pk)
instance.payment_id = validated_data.get('payment', instance.payment_id)
instance.country_id = validated_data.get('country', instance.country_id)
# update m2m links
instance.tags.clear()
instance.tags.add(*validated_data.get('tags'))
instance.save()
return instance
Teşekkür ederim, ama ilk denemede denedim. 'Read_only_fields' ile ilgili sorun, bu alanlar' validated_data' –
'a geçmemekte, bu yüzden istediğinizi düşünün: Bu sizin seri hale getiricinizin puprosları okumak için kullanıldığında, ilgili tüm alanları seri hale getirip, yazı için kullanıldığında İlgili alanları doğrulamak için çalışır, ancak onları kaydetmez. Yanılıyorsam lütfen beni düzeltin. – AntoineWDG
evet, ancak bu veriyi "validated_data" 'da istiyorum, çünkü oluşturulan' Seyahat 'modelindeki tüm bağlantı alanlarını doldurmam gerekiyor. Çözümünde gördüğünüz gibi çözerim. Ama ben bu ödülle başladım, çünkü böyle amaçlar için en iyi uygulamayı bulmak istiyorum. Şimdi DRF sadece kullanım Yine ben daha önce bulundukları ve yalnızca başvurmak için kullanıcı istiyorum çünkü etiketler kaydedilmesini istemiyorum, tam olarak anladığımdan emin değilim, varsayılan –