Django 带有外键的序列化程序-GET和POST

Django 带有外键的序列化程序-GET和POST,django,django-rest-framework,Django,Django Rest Framework,我目前有一个带有外键字段的模型序列化程序。我希望相关模型是一个序列化对象,而不仅仅是一个ID。我知道这是可能的,为相关模型创建一个序列化程序并执行以下操作 related_field = RelatedFieldSerializer() 但是,当主对象发生创建/更新时,如何处理这种情况?例如,我想创建主对象的实例,但相关字段将作为对象(不是pk)发送,并且不会引用现有外键,而是尝试创建新对象 希望这有意义您必须覆盖序列化程序的创建和更新方法。 create方法可能如下所示: class MyM

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

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


希望这有意义

您必须覆盖序列化程序的
创建
更新
方法。
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

有关更多信息,请参阅有关

的文档。如果不想创建现有对象,可以执行类似的操作,利用文档中的
PrimaryKeyRelatedField

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',
        )

然后可以针对数据库中现有
Model1
值的
pk
值进行POST。注意,如果需要,可以使用
pk
值以外的其他值。看

我已经为可写嵌套序列化重写了create()和update()。我不想创建新的RelatedModel实例,我想引用现有的实例。我想做一些类似于MyModel.related\u field=RelatedModel.objects.get(pk=some\u id)的事情。我想做同样的事情@zubhav…你有没有想出解决方案?在
PrimaryKeyRelatedField
上设置
read\u only=False
不会返回序列化的嵌套对象。它仍然返回id。