2016-07-19 25 views
7

İç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 

cevap

2

elimde etkisiz to_internal_value() özel serailizer koymak ve ondan tüm iç içe serializers devralır karar Ne yapmak istediğinizi tam olarak anlayamadım ama read_only_fields'u ayarlayabilmek için ihtiyacınız olan Meta sınıfı olabilir mi? Belgelerdeki this section numaralı belgeye bakın.

1

+0

Teşekkür ederim, ama ilk denemede denedim. 'Read_only_fields' ile ilgili sorun, bu alanlar' validated_data' –

+0

'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

+0

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 –