gpt4 book ai didi

python - 嵌套关系序列化程序中的 Django Rest Framework 模型 Id 字段

转载 作者:太空狗 更新时间:2023-10-29 17:00:27 29 4
gpt4 key购买 nike

我正在使用 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}
]
}

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

编辑 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。然而,这需要一个 default 值……我已经检查过,并且确实使用这个具有默认值的 HiddenField “解决”了问题 - ID 在 validated_data 中。问题是 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 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36473795/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com