2016-04-07 13 views
12

Ben şu iki serializers var Django istirahat Framework usign ediyorum:Django istirahat Çerçeve modeli kimliği alanı

class ServiceSerializer(serializers.ModelSerializer): 
    id = serializers.ReadOnlyField() 

    class Meta: 
     model = ServiceType 
     fields = ('id', 'serviceName', 'servicePrice') 


class CompanyShortListSerializer(serializers.ModelSerializer): 

    services = ServiceSerializer(many=True) 

    class Meta: 
     model = Company 
     fields = ('id','name','address','cost_per_patient','cost_per_month','renting_fee','services') 

ServiceType modeli şöyle görünür:

class ServiceType(models.Model): 
    serviceName = EncryptedCharField(max_length=100, blank=True, verbose_name = "Typ usługi") 
    servicePrice = EncryptedFloatField(null=True, blank=True, verbose_name = "Cena usługi", validators = [MinValueValidator(0.1), MaxValueValidator(999)]) 
    company = models.ForeignKey(Company, related_name = 'services') 

I ilgili hizmetleri değiştirerek mevcut örnekleri güncellemek ister (örneğin, bazılarını silmek). Bunu yapmamın Bunu başarmak için: - Bir KeyError 'id' almak anlamına gelir - Ben ServiceSerializerid alanda açıkça ekledi rağmen

def update(self, instance, validated_data): 
    # Updates an exisitng Company with several services 
    instance.name = validated_data['name'] 
    instance.address = validated_data['address'] 
    instance.cost_per_patient = validated_data['cost_per_patient'] 
    instance.renting_fee = validated_data['renting_fee'] 
    services_data = validated_data['services'] 

    for item in services_data: 
     updatedService = ServiceType(
      serviceName = item['serviceName'], 
      servicePrice = item['servicePrice'], 
      id=item['id'], 
      company=instance) 
     updatedService.save() 

    return instance 

karşılaştığım sorunu service['id'] alan sağlanmamış olmasıdır.

DÜZENLEME

Burada post ediyorum (Chrome alınan) örnek bir istek var: Ben yanlış yaptığını ve nasıl Neyim

{ "id":49,"name":"Test 1", 
    "address":"Testowa 1", 
    "renting_fee":200, 
    "cost_per_month":300, 
    "cost_per_patient":null, 
    "services":[ 
    {"id":67,"serviceName":"Terapia","servicePrice":100}, 
    {"id":68,"serviceName":"Terapia par","servicePrice":150}, 
    {"id":69,"serviceName":"Terapia po angielsku","servicePrice":120} 
    ] 
} 

temelde (bir nesnenin kimliğini almak için ServiceSerializer) iç içe serileştiriciler kullanarak?

DÜZENLEME no.2

Ben şu olsun serileştirici güncelleme fonksiyonu yazdırmak:

print(self.data['services']) bana verir:

[ 
OrderedDict([('id', 67), ('serviceName', u'Terapia'), ('servicePrice', 100.0)]), 
OrderedDict([('id', 68), ('serviceName', u'Terapia par'), ('servicePrice', 150.0)]), 
OrderedDict([('id', 69), ('serviceName', u'Terapia po angielsku'), ('servicePrice', 120.0)]), 
OrderedDict([('id', 70), ('serviceName', u'Terapia grupowa'), ('servicePrice', 140.0)]) 
] 

Ancak print(services_data) temelde (şu verir aynı, ancak kimlik olmadan):

[ 
OrderedDict([(u'serviceName', u'Terapia'), (u'servicePrice', 100.0)]), 
OrderedDict([(u'serviceName', u'Terapia par'), (u'servicePrice', 150.0)]), 
OrderedDict([(u'serviceName', u'Terapia po angielsku'), (u'servicePrice', 120.0)]) 
] 

Ve kaybolmak ids ... geçeceğinden emin alan bir HiddenField olmalıdır serileştirici çıktı gösterimi olacaktır Eğer Django Rest Framework docs göre

DÜZENLEME no.3

. Ancak bu bir default değerini gerektirir ... Bunu kontrol ettim ve bu HiddenField'ı varsayılan bir değer olan 'çözer' ile sorunu çözdüm - kimlik validated_data'da var. Sorun şu ki, id doğru değil. Bu id, seri hale getiriciye gönderilen nesnenin değerine ayarlama olanağı var mı?

cevap

15

Tamam - Sanırım cevabı sonra buldum ...dikkatle the docs :)

okuma Yani the docs göre id alan böyle bir ModelField olarak ayarlanmış olabilir:

id = serializers.ModelField(model_field=ServiceType()._meta.get_field('id')) 

Nitekim, bu hat id alanını ekledikten sonra validated_data :)

+4

Teşekkürler, günümü kurtardınız :-) – bre

+0

Sadece başka bir hayat kurtardınız !. DRF belgeleri bir labirenttir. Önemli Bilgiler, dokümanlarda derinlemesine gizlenmiştir. Teşekkürler – danidee

2

id'u ReadOnlyField olarak ayarladınız. Bu nedenle id doğrulanmış verilerde görünmüyor. Sadece bu satırı kaldırın:

id = serializers.ReadOnlyField() 
+0

Ne yazık ki, hala serileştiriciye gelen 'KeyError 'kimlik' 'get bu çıkardıktan sonra ... :( – user1544500

+0

Nasıl JSON göndermeden olduğunu gözüküyor sen bu ekleyebilir miyim senin soru? – ilse2005

+0

Chrome'dan örnek bir İstek ekledim. Umarım yeterli mi? – user1544500

4
mevcuttur

Kabul edilen cevap işe yarıyor ama gereksiz yere karmaşık. Kimlik alanını salt okunur olmayacak şekilde değiştirebilirsiniz. Örneğin. Böyle bir şey yapar:?

id = serializers.IntegerField(required=False) 
+0

Gerçekten de işe yarıyor. –