基于ManyToManyField值的Django订单查询集



我有一个如下的商业模型:

class Business(models.Model):
class Meta:
verbose_name_plural = "Businesses"
name = models.CharField(max_length=60, null=False, verbose_name="Title")
about = models.TextField(max_length=5000, null=True, verbose_name="Description", blank=True)
upvote = models.ManyToManyField(Account, verbose_name="Upvote Count", blank=True)

账户模型如下:

class Account(models.Model):
CHOICES = [('Male', 'Male'),Female', 'Female'),]
class Meta:
verbose_name_plural = "Accounts"
name = models.CharField(max_length=60, null=False, verbose_name="Title")
gender= models.CharField(max_length=6, null=True, verbose_name="Gender", choices=CHOICES)

我正在尝试获得一个QuerySet,它将按帐户的性别排序。

我该如何做到这一点?

到目前为止,我已经实现了按支持票数排序。

Business.objects.all().order_by("upvote")

您可以将Sum函数[Django-docs]与条件表达式[Django-docs]一起使用,以注释您要订购的值:

from django.db.models import Case, Sum, Value, When
Business.objects.annotate(
order_value=Sum(
Case(
When(upvote__gender='Male', then=Value(1)),
When(upvote__gender='Female', then=Value(-1)),
default=Value(0)
)
)
).order_by('order_value')

上面的查询会给你Business对象更多的支持票,先是女性,然后是男性,你可以通过写.order_by('-order_value')来颠倒顺序。

您可以通过双下划线访问相关模型的字段。请参阅此处的文档。

尝试:

Business.objects.all().order_by("upvote__gender")

相关内容

  • 没有找到相关文章

最新更新