当前位置: 首页 > 面试题库 >

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

蔺沛
2023-03-14
问题内容

我使用的是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字段中明确添加了该字段。

编辑

这是我发布的一个html" target="_blank">示例性请求(来自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的文档,如果某些字段将在序列化器输出表示中,则应为HiddenField。但是,这需要一个default值…我已经检查过,并且确实将此HiddenField与默认值一起使用可以“解决”问题-
ID在validated_data中。问题是,这id是不正确的。是否可以将其设置id为发送给序列化程序的对象的值?


问题答案:

好的-我想我在仔细阅读文档之后找到了答案:)

因此,根据文档,id可以将字段设置为如下所示的ModelField:

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

确实,添加此行之后,该id字段出现在validated_data中:)



 类似资料:
  • 我正在尝试根据父模型的某些条件,而不是外键,向现有的序列化器添加嵌套序列化器。用例是返回一个带有“ResearchTemplate”对象数组的“ResearchTemplate”对象,这些对象通过对Postgres ArrayField进行筛选来标识。 模型 串行化程序

  • 考虑: 如果我们序列化Foo(),输出是: 我想要: 最干净的方法是什么?

  • 问题内容: 将对象反序列化为()时,嵌套对象反序列化为s。是否可以强制将嵌套对象反序列化为s? 问题答案: 我找到了一种通过提供实现将所有嵌套对象转换为的方法: 文档: Json.NET的CustomCreationConverter

  • 给定这样一个类 如何实现可以处理嵌套泛型类型的自定义Kafka反序列化器? 附注:我正在使用jackson进行序列化/反序列化。

  • 我有以下xml 我需要将其反序列化为以下POJO: 这里的问题是被包装在元素中

  • 我用的是Django 2。十、 我有一个用于验证请求的序列化程序。(不是ModelSerializer) 是对模型的引用。 我希望用户在字段中传递数据库id,但在验证后,got被转换为对象。 我试图重写方法,并将对象分配给字段,但它给出了错误