根据M2M关系中字符串字段的组合对Django QuerySet进行排序

krcsximq  于 2023-08-08  发布在  Go
关注(0)|答案(2)|浏览(96)

假设我有两个以多对多关系连接的模型。

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

class Foo(models.Model):
   name = models.CharField()
   bars = models.ManyToManyField(Bars, through='FooBars')

class FooBars(models.Model):
   date = models.DateTimeField(auto_now_add=true)
   foo = models.ForeignKey(Foo, on_delete=models.CASCADE)
   bar = models.ForeignKey(Bar, on_delete=models.CASCADE)

字符串
Foo的QuerySet中,我希望相关的Barsdate排序,这样我就可以在bars中按日期排序的名称的组合字符串上对Foo模型进行排序。
举例来说:
FooBars
| 杆|日期,日期| date |
| --|--| ------------ |
| 阿尔法|2020年01月01日| 01-01-2020 |
| 贝他|2019 -03- 01| 01-03-2020 |
| 伽玛|2019 - 01-02| 01-02-2020 |
| 阿尔法|2020年01月01日| 01-01-2020 |
| 贝他|2019 - 01-02| 01-02-2020 |
| 伽玛|2019 -03- 01| 01-03-2020 |
Foo.bars的组合字符串排序的QuerySet:
| 巴尔斯| bars |
| --| ------------ |
| 阿尔法,贝塔,伽马| alpha, beta, gamma |
| 阿尔法,伽玛,贝塔| alpha, gamma, beta |
我尝试了一些SubqueryF()组合的注解,但无法获得要评估的注解并显示在Queryset上。

js81xvg6

js81xvg61#

如果你使用的是PostgreSQL,你可以执行以下操作:

from django.contrib.models.functions import StringAgg
from django.db.models import F, Q

res_val = Foo.objects.annotate(ordered_vals=StringAgg('bars__foobars__bar__name', ',', ordering='bars__foobars__date', filter=Q(bars__foobars__foo__name=F('name')))).values('name', 'ordered_vals')

字符串
StringAgg文档参考

liwlm1x9

liwlm1x92#

获取数据

Foo.objects.all().values('name', 'foobars__bar__name', 'foobars__date').order_by('name','foobars__bar__name', 'foobars__date')

字符串
在模板中,您可以使用https://docs.djangoproject.com/en/4.2/ref/templates/builtins/#regroup

相关问题