在 Django Rest 中序列化与中间模型的多对多关系
Serialize many-to-many relation with intermediate model in Django Rest
我尝试查看其他主题,但没有找到解决方案...
我有一个多对多模型,它有一个中间模型,里面有另一个字段 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
水平,但没有中间模型...
你能帮我解决我上面提到的 return 结构的序列化程序吗?它必须包括中间模型 ArticleField
和嵌套 BoardField
.
尝试fields = ArticleFieldSrl(source='articlefield_set', many=True)
您没有在 M2M 字段中指定 related_name
,因此应用默认命名,即 'Intermediate model name'_set
,如果您想使用 M2M 关系上的字段,您必须告诉序列化器在哪里寻找。
编辑:
articlefield_set
中移除了驼色,模型名称始终转换为小写
我尝试查看其他主题,但没有找到解决方案...
我有一个多对多模型,它有一个中间模型,里面有另一个字段 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
水平,但没有中间模型...
你能帮我解决我上面提到的 return 结构的序列化程序吗?它必须包括中间模型 ArticleField
和嵌套 BoardField
.
尝试fields = ArticleFieldSrl(source='articlefield_set', many=True)
您没有在 M2M 字段中指定 related_name
,因此应用默认命名,即 'Intermediate model name'_set
,如果您想使用 M2M 关系上的字段,您必须告诉序列化器在哪里寻找。
编辑:
articlefield_set
中移除了驼色,模型名称始终转换为小写