【问题标题】:how to filtered 2 Q conditions in query django?如何在查询 django 中过滤 2 Q 条件?
【发布时间】:2021-09-17 19:31:44
【问题描述】:

所以,我有一个品牌名称是传入品牌之一的所有手机的列表。将输入所需的品牌名称。条目数未知,可能为空。如果输入为空,则必须返回所有手机的列表。

型号:

from django.db import models


class Brand(models.Model):
    name = models.CharField(max_length=32)
    nationality = models.CharField(max_length=32)

    def __str__(self):
        return self.name


class Mobile(models.Model):
    brand = models.ForeignKey(Brand, on_delete=models.CASCADE)
    model = models.CharField(max_length=32, default='9T Pro', unique=True)
    price = models.PositiveIntegerField(default=2097152)
    color = models.CharField(max_length=16, default='Black')
    display_size = models.SmallIntegerField(default=4)
    is_available = models.BooleanField(default=True)
    made_in = models.CharField(max_length=20, default='China')

    def __str__(self):
        return '{} {}'.format(self.brand.name, self.model)

查询:

from django.db.models import F, Q


def some_brand_mobiles(*brand_names):
    query = Mobile.objects.filter(Q(brand__name__in=brand_names) | ~Q(brand__name=[]))
    return query

如果输入为空,则返回所有手机的列表,但不能使用*brand_names返回列表。

例如

query = Mobile.objects.filter(Q(brand_name_in=['Apple', 'Xiaomi']))
return query

query = Mobile.objects.filter(~Q(brand__name=[]))
    return query

这两个条件都单独通过示例起作用,但它不会使用我编写的函数检查这两个条件。 如何解决?

【问题讨论】:

    标签: python django django-orm


    【解决方案1】:

    只检查brand_names 的列表并过滤它是否包含至少一个元素会更简单:

    def some_brand_mobiles(*brand_names):
        if brand_names:
            return Mobile.objects.filter(brand__name__in=brand_names)
        else:
            return Mobile.objects.all()

    【讨论】:

      【解决方案2】:

      试试这个解决方案:

      def some_brand_mobiles(*brand_names):
          queryset = Mobile.objects.all()
          if brand_names:
              queryset = queryset.filter(brand__name__in=brand_names)
          return queryset
      

      通过这种方式,您可以根据queryset 之外的任何其他条件添加更多过滤器。

      【讨论】:

        猜你喜欢
        • 2010-12-31
        • 2020-06-19
        • 1970-01-01
        • 2015-12-30
        • 1970-01-01
        • 2019-01-08
        • 2010-12-31
        • 2011-06-09
        • 2018-12-19
        相关资源
        最近更新 更多