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

我使用的是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。但是,这需要一个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中:)

单行的'if'/'for'语句是否使用Python样式好? - python

我经常在这里看到某人的代码,看起来像是“单线”,这是一条单行语句,以传统的“if”语句或“for”循环的标准方式执行。我在Google周围搜索,无法真正找到可以执行的搜索类型?任何人都可以提出建议并最好举一些例子吗?例如,我可以一行执行此操作吗?example = "example" if "exam" in exam…

在烧瓶蓝图中重用代码 - python

我在flask中实现了REST API。现在我们将一组表公开为资源...所以我有2个新资源res1和res2在后端处理相应的表。我想了解如何最好地重用代码。我当时正在考虑使用常见的蓝图common_bp,因此我可以将其注册为app.register_blueprint(common_bp, url_prefix='/res1') app.…

为什么使用'=='或'is'比较字符串有时会产生不同的结果? - python

我有一个Python程序,其中将两个变量设置为'public'值。在条件表达式中,我有比较var1 is var2失败,但如果将其更改为var1 == var2,它将返回True。现在,如果我打开Python解释器并进行相同的“是”比较,则此操作成功。>>> s1 = 'public' >>…

在返回'Response'(Python)中传递多个参数 - python

我在Angular工作,正在使用Http请求和响应。是否可以在“响应”中发送多个参数。角度文件:this.http.get("api/agent/applicationaware").subscribe((data:any)... python文件:def get(request): ... return Response(seriali…

Python:BeautifulSoup-根据名称属性获取属性值 - python

我想根据属性名称打印属性值,例如<META NAME="City" content="Austin"> 我想做这样的事情soup = BeautifulSoup(f) //f is some HTML containing the above meta tag for meta_tag in soup(&#…