+-
python – 嵌套关系序列化器中的Django Rest Framework模型Id字段
我使用Django Rest Framework,我有以下两个序列化器:

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模型如下所示:

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')

我想通过更改相关服务(例如删除其中一些服务)来更新现有实例.要做到这一点,我这样做:

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

我面临的问题是没有提供service [‘id’]字段 – 这意味着我得到了一个KeyError’id’ – 尽管我在ServiceSerializer id字段中明确地添加了它.

编辑

以下是我发布的示例性请求(取自Chrome):

 { "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}
   ]
 } 

我做错了什么以及如何使用嵌套序列化器获取对象的ID(基本上是ServiceSerializer)?

编辑2号

当我从序列化程序更新功能打印时,我得到以下内容:

print(self.data [‘services’])给了我:

[
 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)])
]

但是,print(services_data)给出以下内容(基本相同,但没有id):

[
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)])
]

ids迷路了……

编辑3

根据Django Rest Framework docs如果某个字段将在序列化器输出表示中,它应该是一个HiddenField.然而,这需要一个默认值…我已经检查过并且确实使用这个HiddenField并使用默认值’解决’问题 – 在validated_data中有ID.问题是id不正确.是否有可能将此id设置为发送到序列化程序的对象的值?

最佳答案
好的 – 我想我找到了答案……仔细阅读 the docs 🙂

所以根据the docs,id字段可以设置为ModelField,如下所示:

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

实际上,添加此行后,id字段出现在validated_data中:)

点击查看更多相关文章

转载注明原文:python – 嵌套关系序列化器中的Django Rest Framework模型Id字段 - 乐贴网