【问题标题】:Django how to order queryset based on filtered many to many field?Django如何根据过滤的多对多字段订购查询集?
【发布时间】:2018-01-05 00:42:55
【问题描述】:

大家好,我想弄清楚如何根据 manyToMany 字段订购查询集,但我还需要过滤该字段。这是确切的问题。

qs = Drink.objects.all()

我想通过相关字段ingredientsuserneeds来订购这个查询集

型号:

class IngredientsUserNeeds(models.Model):
    user = models.ForeignKey(User, blank=True, null=True)
    drinks = models.ManyToManyField(Drink)
    count_need = models.IntegerField(default=0)

class Drink(models.Model):
    name = models.CharField(max_length = 1000, null=True, blank=True)
    user = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True)

在 DRF 列表视图中,我想通过饮料的 ingredientuserneeds_set 对查询集进行排序,但由用户过滤,这将返回一个长度为 1 的查询集,最后按查询集中该单个对象的 count_need 进行排序。这有点像

qs = qs.order_by('ingredientsuserneeds_set__filter(user=user)__first()__count_need') 

但很明显,你不能做我输入的内容。有什么想法吗?

【问题讨论】:

    标签: django python-3.x django-queryset


    【解决方案1】:

    这应该可以解决问题:

    from django.db import models
    from django.db.models import Case, When, F
    
    Drink.objects.all().annotate(
        count_need=Case(When(
            ingredients__user__email='wanaryytel@outlook.com', then=F('ingredients__count_need')), 
            output_field=models.IntegerField()
        )
    ).first().count_need
    

    【讨论】:

      猜你喜欢
      • 2013-08-18
      • 2020-01-24
      • 2020-06-16
      • 1970-01-01
      • 2020-04-30
      • 2017-07-15
      • 2011-04-07
      • 2017-03-09
      • 2018-01-03
      相关资源
      最近更新 更多