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