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

how to filtered 2 Q conditions in query django?

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

型号:

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

如果输入为空,将return编辑所有手机的列表,但我不能使用*brand_names来return列表。

例如

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):
    <strong>if brand_names</strong>:
        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 上的任何其他条件添加更多过滤器。