Django用和过滤列表

时间:2016-11-13 18:42:51

标签: django filter django-views django-queryset

所以我试图做的是过滤来自查询的列表并返回可能的选项。

我有三个型号:

class Category(models.Model):
    title = models.CharField(max_length=60, unique=True)

class Colors(models.Model):
    title = models.CharField(max_length=40, unique=True)

class Post(models.Model):
    title = models.CharField(max_length=40)
    colors = models.ManyToManyField(Color)
    category = models.ForeignKey(Category)
    is_active = models.BooleanField(default=True)

现在我要做的是:

  • 获取所有帖子,其中is_active == True
  • 获取查询中包含颜色的所有帖子
  • 获取所有类别与查询中的类别相同的帖子

我的尝试看起来像这样:

# to be able using multiple values like ?color=red&color=blue&color=yellow
queryparams = dict(request.query_params.lists()) 

colors_list = []
categories_list = []

if 'color' in query_params:
    colors_list = query_params['color']

if 'category' in query_params:
    categories_list = query_params['category']

posts = Post.objects.filter(is_active=True)

if colors_list:
    for color in colors_list:
        posts = posts.filter(colors__title=color)

if categories_list:
    for category in categories_list:
        posts = posts.filter(category__title=category)

colors_options = posts.order_by('colors__title').values_list('colors__title', flat=True).distinct()
categories_options = posts.order_by('category__title').values_list('category__title', flat=True).distinct()

选项部分目前无法按我的意愿行事。假设我有5个具有以下颜色的对象:

  1. 黑色,蓝色,白色,黄色
  2. 蓝色,红色,白色
  3. 红色,白色,黄色
  4. 黑色,黄色
  5. 如果我要搜索?color = red& color = white,它应该给我以下选项:

    1. 黑色,蓝色,白色,黄色
    2. 蓝色,红色白色
    3. 红色 白色,黄色
    4. 黑色,黄色
    5. 蓝色,红色,白色,黄色但它只返回一种颜色

      是否还有更有效和惯用的方法来实现这一目标? 这只是一个片段,实际上有更多的选择,但我试图在这里保持清晰。

1 个答案:

答案 0 :(得分:0)

而不是做

if colors_list:
    for color in colors_list:
        posts = posts.filter(colors__title=color)

尝试:

if colors_list:
    posts = posts.filter(colors__title__in=colors_list)

请参阅:CertInstaller