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

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

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

  1. class Bar(models.Model):
  2. name = models.CharField()
  3. class Foo(models.Model):
  4. name = models.CharField()
  5. bars = models.ManyToManyField(Bars, through='FooBars')
  6. class FooBars(models.Model):
  7. date = models.DateTimeField(auto_now_add=true)
  8. foo = models.ForeignKey(Foo, on_delete=models.CASCADE)
  9. 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,你可以执行以下操作:

  1. from django.contrib.models.functions import StringAgg
  2. from django.db.models import F, Q
  3. 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#

获取数据

  1. 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

相关问题