【发布时间】:2019-12-02 14:56:40
【问题描述】:
我正在尝试进行 Django 注释,并希望通过过滤字段来列出一些对象实例。
我有两个模型,即Category 和Article。这个Category 模型有一个名为super_category 的字段,它是一个选择字段,coices 是“学术,其他”
class Category(models.Model):
name = models.CharField(
max_length=128,
null=False,
blank=False,
default=None,
verbose_name=_("Name"),
)
super_category = models.CharField(
blank=False,
null=False,
choices=SC_CHOICES,
max_length=10,
default=None,
)
现在,这是我当前的注释结果:
[
{
'article_count': 716,
'super_category': u'ACADEMIC',
'category_count': 5,
},
{
'article_count': 800,
'super_category': u'OTHER',
'category_count': 2,
}
]
对此的查询:
Category.objects.only(
"id",
"articles__id",
"super_category",
).values(
"super_category",
).annotate(
category_count=Count("id", distinct=True),
article_count=Count("articles"),
).order_by(
"super_category",
)
我想做的是,将类别添加到结果中
所以最后,我想要这样的东西:
[
{
'article_count': 716,
'super_category': u'ACADEMIC',
'category_count': 5,
'categories': [
{
"id": 1,
"name": "COMPUTER SCIENCE",
"article_count": 15,
},
...
]
},
{
'article_count': 800,
'super_category': u'OTHER',
'category_count': 2,
'categories': [
{
"id": 1,
"name": "MAGAZINE",
"article_count": 15,
},
...
]
}
]
现在,由于附加的“类别”与我要注释的对象类型相同,我真的不知道该怎么做。
编辑:
我正在使用如下序列化器:
class SuperCategorySerialiser(BaseSerializer):
super_category = fields.CharField(read_only=True)
article_count = fields.IntegerField(read_only=True)
category_count = fields.IntegerField(read_only=True)
但请注意,我没有 SuperCategory 模型。
【问题讨论】:
-
请使用序列化程序。即使没有注释/...使用
.values()也不是序列化的好主意。 -
谢谢,我补充了我的问题。我忘了提供@WillemVanOnsem
-
顺便问一下,您是否有理由不使用
SuperCategory模型? -
@WillemVanOnsem 它是事先这样实现的,“SuperCategory”的借口可以是 2,仅此而已。 SuperCategory 只是一个字符串,没有任何信息。一个类别可以属于 Academic 或 Other,您以后不能再创建另一个“SuperCategory”。
标签: django django-orm django-filter django-annotate