2016-01-25 9 views
15

böyle modelleri var:Yaz yalnızca Django kalan çerçevesinde sadece alanları okumak

class ModelA(models.Model): 
    name = models.CharField() 


class ModelB(models.Model): 
    f1 = models.CharField() 
    model_a = models.ForeignKey(ModelA) 

Serileştiriciler:

class ASerializer(serializers.ModelSerializer): 
    model_b_ids = serializers.CharField() 
    class Meta: 
     model = ModelA 
     write_only_fields = ('model_b_ids',) 

görünümler:

class AView(CreateModelMixin, GenericViewSet): 

    def perform_create(self, serializer): 
     model_b_ids = parse_somehow(serializer.validated_data["model_b_ids"]) 
     #do something... 

I alıyorum sorun "model_b_ids"

ileKullanıcı, posta verilerini gönderirken göndermelidir.

İlgili modellere bağlantı oluşturmak için perform_create'de kullanıyorum.

Fakat bu, ModelA'da "gerçek sütun" değil, bu yüzden kaydetmeye çalıştığımda, istisna artar.

Ben validated_data pop denedim ama sonra tekrar model_b_ids modelinden okuyamayan bir yere hata alıyorum. Bu tür alanı doğru kullanmanın bir fikri var mı?

cevap

0

Muhtemelen, ModelA ürününüzün modelb_set ürününe sahip olduğunu denetliyorsunuz. Django'da, bir model sınıfındaki ilişkiyi tanımlarsınız. Django, hedef modelin alt kaplaması ve _set ile eklenmesiyle geriye doğru bir ilişki sunar. Yani yapabilirdi:

a = ModelA.objects.get(pk=1) 
a.modelb_set.all() 

Bu Modela dan 1 numarası (veya birincil anahtar) ile eleman almak ve ilgili tüm ModelB unsurları almak istiyorum.

Varsayılan değerini geçersiz kılmak related_name için bir değer ayarlayabilirsiniz

: Eğer hafifçe seri hale uyarlayabilirsiniz DRF yılında

class ModelB(models.Model): 
    f1 = models.CharField() 
    model_a = models.ForeignKey(ModelA, related_name='model_b') 

: serializers.CharField() ile

class ASerializer(serializers.ModelSerializer): 
    model_b = serializers.PrimaryKeyRelatedField(many=True, read_only=False) 

    class Meta: 
     model = ModelA 
     write_only_fields = ('model_b',) 

değerleri yayınlayıp yazamazsınız Onları modele çünkü bir model alanı değil.

Bu örnek bir deneyin. Tinker ve deney. Bu çözümü size daha yakınlaştırmalı.

EDIT: Django'nun PascalCase sınıf adları için geriye dönük ilişki adını nasıl yarattığından emin değilim. ModelB için model_b_set mu? Yoksa modelb_set mu? Onu deneyebilirsin.

0

ModelA nesnesini başlatmak, özelliklerini ayarlamak, kaydetmek, varolan modelB nesnelerindeki ilişkileri ayarlamak, bunları kaydetmek ve başarıya ulaşmak için ASerializer'daki serializer.save() yöntemini geçersiz kılabilirsiniz. Ama belki de ilgili ilgili dizini ve RelatedField dizgesini önerdiği şekilde ayarlayacağım, aynı şeyi daha az yazarak yapacağız.ve genel olarak daha iyi :) im yanlışsa

22

düzelt ama göre Meta niteliğini

write_only_fields

sahiptir dinlenme çerçeveyi django sanmıyorum onların size extra_kwargs tek alanlarını yazma set docs

örn.

15

Django DİNLENME Çerçeve documentation:

ModelSerializer üzerinde write_only_fields seçeneği PendingDeprecation taşındı ve daha genel extra_kwargs

böyle yapmak önerilir yüzden

ile değiştirilmiştir: Eğer extra_kwargs kullanmalısınız:

extra_kwargs = {'model_b_ids': {'write_only': True}} 

ya:

model_b_ids = serializers.IntegerField(write_only=True) 
+0

DRF'yi 3.1.3'ten 3.3.3'e güncelledim ve aniden Kullanıcılarımın parolaları geri gönderiliyordu (Write_only'nin Meta atribut'undan önce vardı). Çözümünüz bu sorunu giderir. Teşekkürler! – vabada