【问题标题】:Django Annotate - How to list self instances?Django Annotate - 如何列出自我实例?
【发布时间】:2019-12-02 14:56:40
【问题描述】:

我正在尝试进行 Django 注释,并希望通过过滤字段来列出一些对象实例。

我有两个模型,即CategoryArticle。这个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


【解决方案1】:

将此添加到您的目标序列化程序中

 Cattegories = CategorySerializer(read_only=True,many=True)

然后在目标序列化程序的字段中提及它

fields = ('X','Y','Categrories')

希望这会有所帮助:)

【讨论】:

    猜你喜欢
    • 2016-11-29
    • 1970-01-01
    • 2017-01-15
    • 2022-08-16
    • 2021-01-30
    • 2014-05-18
    • 2020-06-02
    • 2017-10-10
    • 2020-04-13
    相关资源
    最近更新 更多