如何在查询django中过滤2个Q条件?



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

模型:

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

这两个条件单独在示例中都可以工作,但它不会用我编写的函数检查这两个条件。如何解决?

如果包含至少一个元素,则仅检查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()

试试这个解决方案:

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

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

最新更新