gpt4 book ai didi

Django 按模型 Meta 中的注释排序

转载 作者:行者123 更新时间:2023-12-02 18:39:15 24 4
gpt4 key购买 nike

有没有办法通过带注释的字段在模型元类中设置排序?

class ModelA(models.Model):
name = models.CharField()

class ModelB(models.Model):
name = models.CharField()
model_a = models.ForeignKey(ModelA)

这是我可以对查询集执行的操作,但如果可能的话,需要在类 Meta 上执行相同的方法

ModalA.objects.all()
.annotate(
count_b=Count("modal_a")
)
.order_by("count_b")

最佳答案

您可以覆盖 .objects 管理器进行排序,因此:

class ModelAManager(models.Manager):

def <strong>get_queryset</strong>(self, *args, **kwargs):
return super().get_queryset(*args, **kwargs).annotate(
<strong>count_b = Count('modelb')</strong>
).order_by('count_b')

然后将其注册为ModelA的管理器:

class ModelA(models.Model):
# …
objects = ModelAManager()

话虽这么说,我会按您需要的 View 中的计数进行排序,而不是一般情况下,在这里您进行LEFT OUTER JOIN,但这意味着如果您进行额外的联接通过过滤、注释等,两个(或多个)JOIN 将相互交互,从而充当其他 LEFT OUTER JOIN 的乘数。

因此,在必要时最好简单地按相关 ModelB 的数量进行排序。

我们还可以向 Queryset 添加一个方法,以便可以通过以下方法按 count_b 进行排序:

class ModelAQueryset(models.QuerySet):
def order_by_b(self):
return self.annotate(
<strong>count_b=Count('modelb')</strong>
).order_by('count_b')

然后我们根据ModelAQueryset定义一个管理器:

class ModelA(models.Model):
# …
objects = <strong>ModelAQueryset.as_manager()</strong>

然后您可以在 b 上订购:

ModelA.objects<strong>.order_by_b()</strong>

因此,您可以在构造查询集的链中的任何部分调用查询集中的.order_by_b()

关于Django 按模型 Meta 中的注释排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68283920/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com