如何在Django Rest Framework中的一个序列化程序中更新两个模型?

时间:2016-09-29 23:41:23

标签: django django-rest-framework

我有一个数据库模式,它将每个特定类型的对象存储在两个独立的表中(每个表中有一行,每个表中有不同的数据,外键从一个到另一个。)

不幸的是,Django Rest Framework倾向于假设序列化器和模型之间存在一对一的对应关系,这与我的情况不符。我该怎么接近这个?似乎序列化程序应返回对象的表示形式,这将是ajax请求的实际HTTP响应,因此使用两个序列化程序似乎不正确。我已经考虑过扩展BaseSerializer(这是我目前计划实现的方法,如果我找不到更好的解决方案),但某些方法需要instance,它应该包含序列化对象所需的所有数据,而我有两个相关的实例。

任何建议都会受到超级赞赏!谢谢。

1 个答案:

答案 0 :(得分:8)

Writable nested representations部分可能会对您有所帮助。

您有2个模型ModelAModelB。创建您的第一个模型的序列化程序

class ModelASerializer(serializers.ModelSerializer):
    class Meta:
        model = ModelA
        fields = ('fields',..) # 

然后在其他模型的序列化程序中添加第一个序列化程序并覆盖所需的方法(如createupdate)。像这样:

class ModelBSerializer(serializers.ModelSerializer):
    # add the serializer for the foreignkey model 
    model_a = ModelASerializer()   

    class Meta:
        model = ModelB
        fields = ('fields',..) # 

   def create(self, validated_data):
       modela_data = validated_data.pop('model_a')
       model_b = ModelB.objects.create(**validated_data)
       ModelA.objects.create(model_b=model_b, **modela_data)
       return model_b

   # override update too ..