gpt4 book ai didi

django - 在 Django Rest 框架中更新/修补/创建嵌套模型

转载 作者:行者123 更新时间:2023-12-04 17:18:37 25 4
gpt4 key购买 nike

我正在使用 Django 1.6.8 和 Django Rest 2.4.4。我有一个 Person 模型,其中包含 Address 和 PhoneNumbers 的单独模型。

class Person(models.Model):
address = models.OneToOneField(Address, blank=True, null=True)
phoneNumbers = models.ManyToManyField(PhoneNumber, blank=True)

class Address(models.Model):
address = models.CharField(max_length=50)
city = models.CharField(max_length=50)
state = models.CharField(max_length=2)

class PhoneNumber(models.Model):
number = models.CharField(max_length=15)
numberType = models.CharField(default='Mobile', max_length=15)

我在 Django REST 框架中使用嵌套序列化程序。
class PersonSerializer(serializers.HyperlinkedModelSerializer):
id = serializers.Field('id')

address = AddressSerializer(source='address')
phoneNumbers = PhoneNumberSerializer(many=True)

这适用于 GET(我将地址和电话号码作为嵌套的 json 字段获取),但我需要相同的 PUT/POST/PATCH。具体来说,对于每个电话号码,如果指定了id,我希望它被更新,如果json中没有id,我希望它被创建。地址也一样,都在同一个 API 调用中。

最佳答案

您需要实现自己的 create()和/或 update()支持这一点的方法。

它在 Django Rest doc 中有解释它可用 自 Django Rest 3.0 :

以下示例演示了如何使用嵌套的配置文件对象创建用户。

class UserSerializer(serializers.ModelSerializer):
profile = ProfileSerializer()

class Meta:
model = User
fields = ('username', 'email', 'profile')

def create(self, validated_data):
profile_data = validated_data.pop('profile')
user = User.objects.create(**validated_data)
Profile.objects.create(user=user, **profile_data)
return user

(……)

由于嵌套创建和更新的行为可能不明确,并且可能需要相关模型之间的复杂依赖关系,因此 REST framework 3 要求您始终明确地编写这些方法。默认的 ModelSerializer .create() 和 .update() 方法不包括对可写嵌套表示的支持。

关于django - 在 Django Rest 框架中更新/修补/创建嵌套模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27687614/

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