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

时间:2014-12-29 11:03:23

标签: django django-rest-framework django-1.6

我使用的是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调用中。

1 个答案:

答案 0 :(得分:10)

您需要实施自己的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框架3要求您始终明确地编写这些方法。默认的ModelSerializer .create()和.update()方法不包括对可写嵌套表示的支持。