与Django Rest中的中间模型序列化多对多关系

问题描述 投票:1回答:1

我尝试检查其他主题,但没有找到解决方法...

我有一个多对多模型,具有带有另一个字段additional_field的中间模型。

class BoardField(models.Model):
    title = models.CharField(max_length=500, default='')

class Article(models.Model):
    title = models.CharField(max_length=500, default='')
    fields = models.ManyToManyField(BoardField, through='ArticleField', through_fields=('article', 'board_field'))

class ArticleField(models.Model):
    article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='task')
    board_field = models.ForeignKey(BoardField, on_delete=models.CASCADE)

    additional_field = models.CharField(max_length=200, blank=True, null=True)

我想使用结构序列化Article

[
    "title":"Title",
    "fields":[
        {
            "board_field": {
                "title":"Title"
            },
            "additional_field":"Additional info"
        }
    ]
]

所以,我写了序列化器:

class BoardFieldSrl(serializers.ModelSerializer):

    class Meta:
        model = BoardField
        fields = (
            'title',
        )

class ArticleFieldSrl(serializers.ModelSerializer):

    board_field = BoardFieldSrl()

    class Meta:
        model = ArticleField
        fields = (
            'board_field',
            'additional_field',
        )

class ArticleListSrl(serializers.ModelSerializer):

    fields = ArticleFieldSrl(many=True)

    class Meta:
        model = Article
        fields = (
            'title',
            'fields',
        )

但是我总是出错:

Got AttributeError when attempting to get a value for field `board_field` on serializer `ArticleFieldSrl`.
The serializer field might be named incorrectly and not match any attribute or key on the `BoardField` instance.
Original exception text was: 'BoardField' object has no attribute 'board_field'.

[我又举了几个例子,但是他们没有给出我需要的结果,我需要...我的最大值-我得到了BoardField有等级,但没有中间模型...

您能帮我使用我上面提到的序列化程序,那种返回结构吗?它必须包括中间模型ArticleField和嵌套的BoardField

django django-rest-framework django-serializer
1个回答
1
投票

尝试fields = ArticleFieldSrl(source='articlefield_set', many=True)

您未在M2M字段中指定related_name,因此应用了默认命名,即'Intermediate model name'_set,如果要使用M2M关系中的字段,则必须告诉序列化程序在哪里寻找。

编辑:从articlefield_set中删除骆驼,型号名称始终转换为小写

© www.soinside.com 2019 - 2024. All rights reserved.