use*_*500 16 python django rest django-rest-framework
我使用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')
Run Code Online (Sandbox Code Playgroud)
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')
Run Code Online (Sandbox Code Playgroud)
我想通过更改相关服务来更新现有实例(例如删除其中一些).要做到这一点,我这样做:
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
Run Code Online (Sandbox Code Playgroud)
我面临的问题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}
]
}
Run Code Online (Sandbox Code Playgroud)
我做错了什么以及如何使用嵌套序列化器获取对象的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)])
]
Run Code Online (Sandbox Code Playgroud)
但是,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)])
]
Run Code Online (Sandbox Code Playgroud)
而ids迷路...
编辑3
根据Django Rest Framework文档如果某个字段将在序列化器输出表示中,它应该是a HiddenField.然而,这需要一个default值...我已经检查过并且确实使用这个HiddenField,默认值'解决'问题 - 在validated_data中有ID.问题是这id是不正确的.是否有可能将此id值设置为发送到序列化程序的对象的值?
use*_*500 23
好的 - 我想我找到了答案......仔细阅读文档 :)
所以根据文档,id可以将字段设置为ModelField,如下所示:
id = serializers.ModelField(model_field=ServiceType()._meta.get_field('id'))
Run Code Online (Sandbox Code Playgroud)
实际上,添加此行后,该id字段存在于validated_data中:)
Cor*_*ory 15
接受的答案有效,但不必要地复杂化.您只需将ID字段更改为不只读即可.像这样的事情会做:
id = serializers.IntegerField(required=False)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7402 次 |
| 最近记录: |