我使用的是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”循环的标准方式执行。我在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(…