Django order_by多对多关系

时间:2017-11-06 22:18:03

标签: django django-queryset

如何根据多对多关系条件是否为真来订购查询集?

class Publication(models.Model):
    name = models.CharField(max_length=100)
    books = models.ManyToManyField(Book)

class Book(models.Model):
    name = models.CharField(max_length=100)
    author = models.CharField(max_length=100)

我想按照

的方式创建一个查询集
Publication.objects.all().order_by('books__name'='Awesome Book')

这样,第一个项目就是Publication,其中包含Book标题为" Awesome Book"然后最后你得到了所有没有这本书的Publication's

1 个答案:

答案 0 :(得分:1)

这是一种可行的方法,创建一个新的字段进行排序,将逻辑表达式映射到数值。

from django.db.models import Case, When, Value, IntegerField

Publication.objects.annotate(
    ordering=Case(
        When(books__name="Awesome Book", then=Value(0)),
        default=Value(1),
        output_field=IntegerField(),
    )
).order_by("ordering")