当嵌套序列化程序中有另一个模型(manytomany)时,如何在 django 模型上发布,我想同时创建两者

Posted

技术标签:

【中文标题】当嵌套序列化程序中有另一个模型(manytomany)时,如何在 django 模型上发布,我想同时创建两者【英文标题】:How do I post on a django model when it has another model (manytomany ) inside nested serializers, I want at the same time to create both 【发布时间】:2021-12-27 17:26:09 【问题描述】:

我的模型是:

    期间 班级学生主题

Period 与 ClassStudentSubject 有多对多关系

当我发布一个句点时,我不想选择使用哪个现有 ClassStudentSubject 对象,我想与句点一起创建一个新对象。

ClassStudentSubject - 我创建这个模型是为了将一些周期数据构造成一个对象

【问题讨论】:

【参考方案1】:

这可以通过重写序列化程序的 create 方法来实现。您必须先创建“ClassStudentSubject”对象,然后在“create”方法中创建 Period 对象时使用该对象。 以下是符合您要求的文档中的示例。

class TrackSerializer(serializers.ModelSerializer):
    class Meta:
        model = Track
        fields = ['order', 'title', 'duration']

class AlbumSerializer(serializers.ModelSerializer):
    tracks = TrackSerializer(many=True)

    class Meta:
        model = Album
        fields = ['album_name', 'artist', 'tracks']

    def create(self, validated_data):
        tracks_data = validated_data.pop('tracks')
        album = Album.objects.create(**validated_data)
        for track_data in tracks_data:
            Track.objects.create(album=album, **track_data)
        return album

【讨论】:

这解决了我的问题。我可以从专辑与曲目一起发布,但我无法在具有多对多关系的字段上发布。就像在 Tracks 的情况下,如果订单是与另一个对象的多对多关系,我可以从 Tracks 发布带有订单 id 数组的帖子,但如果我从专辑中发布它会告诉我: ield 'id' 期望一个数字但是got [] 其中 2B 是 Orders 模型中 name 的值“returned def __str__(self) -> str: return (self.name)” 字段 'id' 需要一个数字,但得到了 []。您可以通过传递订单对象的 id 来解决此问题。例如,如果我必须传递任何 Orders 实例的 id,我必须如下所示 Order_obj = Orders.objects.get(pk=1) Order_obj.id 或 Order_obj。需要传递 ***.com/questions/70006315/…我把代码贴在这里了,如果你可以看看 尝试创建订单实例 -> 专辑实例 -> 没有 manytomanyfield 的曲目。然后将 Order 实例添加到新创建的轨道实例中。根据 django 文档,“Track”模型的“order”字段应该在 Track 实例保存后获得一个值。我不确定,这会解决你的问题,但你可以参考下面的文档并在修改序列化程序之前在控制台中尝试。 docs.djangoproject.com/en/3.2/topics/db/examples/many_to_many

以上是关于当嵌套序列化程序中有另一个模型(manytomany)时,如何在 django 模型上发布,我想同时创建两者的主要内容,如果未能解决你的问题,请参考以下文章

Django:相互嵌套序列化程序

Django Rest Framework 中的嵌套序列化程序“通过模型”

嵌套关系序列化程序中的 Django Rest Framework 模型 Id 字段

反序列化嵌套的 json 对象。当内部对象可能不同时

使用 Django Rest Framework 序列化程序发布到嵌套字段

如何在 Django Rest Framework 中过滤嵌套的序列化程序?