使用函数在 django 对象中注释

Posted

技术标签:

【中文标题】使用函数在 django 对象中注释【英文标题】:Annotate in django object using function 【发布时间】:2021-09-02 23:07:38 【问题描述】:

我有两个模型 Parent 和 Child

class Parent(models.Model):
    id = models.IntegerField(...)

class Child(models.Model)
    id = models.IntegerField(...)
    parent = models.ForeignKey(Parent, ...)
    wanted = models.CharField(default="yes")

我有一个查询集

parents = Parent.objects.all()

我想为基于子模型的父查询集注释一个字符字段

get_status(obj):
    # complex function which returns string based on child onjects
    children = Child.objects.filter(parent_id = obj.id)
    if children.count() == 1:
        return 'some'
    if children.count() == 2:
        return  'thing'

我想要这样的东西,如何将对象发送到 get_status() 函数。

queryset.annotate(status = Value(get_status(), output_field=CharField()))

【问题讨论】:

【参考方案1】:
from django.db.models import Count, Case, When, Value, CharField

Parent.objects.annotate(
    children=Count('child')
).annotate(
    status=Case(
        When(children__gte=2, then=Value('thing')),
        When(children=1, then=Value('some')),
        output_field=CharField()
    )
)

【讨论】:

以上是关于使用函数在 django 对象中注释的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 中注释相关和多重过滤的对象

在 django 中,有没有办法在单个查询中直接用相关对象注释查询?

有啥方法可以使用 python 中的注释在 django 中编写 URL

Django 在 json 字段中注释特定键

需要根据找到的 Q 对象来注释 Django querySet

Django 查询 - 在带注释的计数过滤器中获取父对象