通过第一个相关对象以多对多字段顺序查询

问题描述 投票:0回答:1

在 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

django django-orm
1个回答
0
投票

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'
)
© www.soinside.com 2019 - 2024. All rights reserved.