带外键的串行器 - GET和POST

时间:2017-02-02 23:32:36

标签: django django-rest-framework

我目前有一个带有外键字段的模型序列化器。我希望相关模型能够成为序列化对象,而不仅仅是ID。我知道这可以通过为相关模型创建序列化程序并执行

来实现
related_field = RelatedFieldSerializer()

但是,如何在主对象创建/更新时处理这种情况?例如。我想创建主对象的实例,但相关字段将作为对象(而不是pk)发送,并且不会引用现有外键,它将尝试创建新对象。

希望这是有道理的

2 个答案:

答案 0 :(得分:3)

您必须覆盖序列化程序的createupdate方法。 create方法可能如下所示:

class MyModelSerializer(serializers.ModelSerializer):
    related_field = RelatedFieldSerializer()

    class Meta:
        model = MyModel
        fields = ('id', 'related_field')

    def create(self, validated_data):
        related_data = validated_data.pop('related_field')
        instance = MyModel.objects.create(**validated_data)
        RelatedModel.objects.create(my_model=instance, **related_data)
        return instance

有关详细信息,请参阅有关Writable nested representations

的文档

答案 1 :(得分:1)

如果您不想创建现有对象,则可以使用PrimaryKeyRelatedField来记录here

models.py

class Model1(models.Model):
    time = models.DateTimeField(auto_now=True)

class Model2(models.Model):

    model1= models.ForeignKey(Model1, on_delete=models.CASCADE)
    f1 = models.FloatField()

然后你的serializers.py会是这样的:

class Model2Serializer(serializers.ModelSerializer):
    model1 = serializers.PrimaryKeyRelatedField(
        read_only=False, queryset=Model1.objects.all())

    class Meta:
        model = Model2
        fields = (
            'model1',
            'f1',
        )

然后可以根据数据库中现有pk值的Model1值进行发布。注意,如果需要,您可以使用除pk值之外的其他值。见this post