在 django 中,我想在按第一个相关对象排序的多对多字段中进行查询。这意味着查询集必须在多对多对象的第一个位置搜索对象,然后在其他位置搜索。
作为一个简单的错误示例,我想获得这样的对象:
queryset = Practitioner.objects.filter(practices__0__city__slug='toronto')
queryset += Practitioner.objects.filter(practices__other__except__0__city__slug='toronto')
注:
practices
是ManyToManyField
模型中
Practice
模型的
Practitioner
A
ManyToManyField
没有 order。就像任何没有列排序的查询一样,数据库可以按任意顺序返回记录,并且每次查询时都会有所不同。
如果您想添加订单(或者例如“默认”实践之类的内容,您可以将其添加到联结表中)。喜欢:
from django.db import models
class City(models.Model):
slug = models.SlugField()
# …
class Practice(models.Model):
city = models.ForeignKey(City, on_delete=models.PROTECT)
class Practitioner(models.Model):
practices = models.ManyToManyField(Practice, through='PractitionerPractice')
class PractitionerPractice(models.Model):
practitioner = models.ForeignKey(Practitioner, on_delete=models.CASCADE)
practice = models.ForeignKey(Practice, on_delete=models.CASCADE)
standard = models.BooleanField(default=False)
class Meta:
constraints = [
models.UniqueConstraint(
fields=('practitioner',),
condition=models.Q(standard=True),
name='one_standard',
)
]
UniqueConstraint
[Django-doc]可以在数据库级别保证每个Practitioner
只列出一个Practice
作为standard=True
一个。
在这种情况下,我们可以使用以下方式检索查询:
Practitioner.objects.filter(practices__city__slug='toronto').order_by(
'-practitionerPractice__standard'
)