我目前有一个带有外键字段的模型序列化器。我希望相关模型能够成为序列化对象,而不仅仅是ID。我知道这可以通过为相关模型创建序列化程序并执行
来实现related_field = RelatedFieldSerializer()
但是,如何在主对象创建/更新时处理这种情况?例如。我想创建主对象的实例,但相关字段将作为对象(而不是pk)发送,并且不会引用现有外键,它将尝试创建新对象。
希望这是有道理的
答案 0 :(得分:3)
您必须覆盖序列化程序的create
和update
方法。
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。