与Or运算符的django_filters.FilterSet

时间:2016-05-26 10:27:56

标签: django django-queryset django-filters

我想用django_filters.FilterSet尝试 OR语句,以创建“仅过滤字段”(即:模型中不存在)。该字段应检查过滤器值是否与模型“真实字段”(其中两个)匹配

这是我的模特:

class Project(models.Model):
    id          = models.BigIntegerField(primary_key=True)
    name        = models.CharField(max_length=255) 
    cat         = models.ForeignKey(Category, related_name='projects', db_index=True, default=None, null=True)
    cat_main    = models.IntegerField(db_index=True, null=True)
    category_id = models.IntegerField(db_index=True, null=True)
    country     = models.CharField(max_length=16, null=True)
    added       = models.DateTimeField(auto_now_add=True)
    modified    = models.DateTimeField(auto_now=True)

这是我试图实现的代码:

from django.db.models import Q

class ProjectCatFilter(django_filters.FilterSet):
    category = django_filters.MethodFilter(name='category', action='category_or_filter')
    class Meta:
        model = Project
        fields = ['cat_main', 'category_id']

    def category_or_filter(self, queryset, value):
        return queryset.filter(
            Q(category_id=value) | Q(cat_main=value)
        )

以下是应该返回“我的类别”匹配“cat_main”或“category_id”的项目的调用

from server.ks.models import Project
projects = Project.objects.filter(category=1)
for p in projects:
    print p.name, p.id, p.cat_main, p.category_id

但是我收到了这个错误:

  

django.core.exceptions.FieldError:无法将关键字“类别”解析为字段。选项包括:name,cat,cat_id,cat_main,category_id,country,added,modified

那么Project.objects.filter(category = 1)返回与category_id或main_cat字段匹配的项目(使用FilterSet与否)的正确/最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

django-filter' s from selenium.common.exceptions import NoSuchElementException try: time.sleep(2) self.driver.find_element_by_xpath(".//*[@id='memberReview']/div[2]/div/div/div[2]/div[1]/div[1]/a").click() except NoSuchElementException: print "onetouch not present....continuing script" 在概念上类似于Django的内置FilterSet

  • ModelForm生成一个用于创建或更新模型类实例的表单。
  • ModelForm生成一个用于构建orm查询的表单。

您的示例调用无效,因为它没有调用FilterSet - 没有FilterSet字段可以过滤。

手动测试filterset:

category