【问题标题】:django-filter custom filter not get querysetdjango-filter 自定义过滤器没有得到查询集
【发布时间】:2018-09-29 14:22:03
【问题描述】:

首先,我是 Django-filter 的初学者,如果你能提供最好的解决方案,我会很高兴。

我需要按 ForignKeys 的字段过滤 QuerySet。确切地说是authorworker

模型.py

​​>
class Object(models.Model):
    class Meta:
        abstract = True

    author = models.ForeignKey('Users.User', on_delete=models.CASCADE)


class Task(Object):
    priority_choices = (
        ('high', 'Высокий'),
        ('middle', 'Стандартный'),
        ('low', 'Низкий'),
    )

    status_choices = (
        ('open', 'Открыта'),
        ('done', 'Выполнена'),
        ('close', 'Закрыта'),
    )

    name = models.CharField(max_length=140)
    description = models.TextField()
    end_date = models.DateField()
    worker = models.ForeignKey('Users.User', on_delete=models.CASCADE, related_name='worker_set')
    priority = models.CharField(max_length=15, choices=priority_choices)
    status = models.CharField(max_length=15, choices=status_choices)

过滤器.py

​​>
class TaskFilter(filters.FilterSet):
    my_tasks = filters.BooleanFilter(
        label="Мои задачи",
        method='my_task_filter',
        widget=forms.CheckboxInput()
    )
    tasks_for_me = filters.BooleanFilter(
        label="Задачи для меня",
        method='tasks_for_me_filter',
        widget=forms.CheckboxInput()
    )
    commented_tasks = filters.BooleanFilter(
        label="Я комментировал",
        method='commented_tasks_filter',
        widget=forms.CheckboxInput())

    class Meta:
        model = Task
        fields = ['my_tasks', 'tasks_for_me', 'commented_tasks']

    def my_task_filter(self, queryset, name, value):
        print(1, self, queryset, name, value)
        return queryset.filter(author_id=self.request.user.id)

    def tasks_for_me_filter(self, queryset, name, value):
        print(2, self, queryset, name, value)
        return queryset.filter(worker_id=self.request.user.id)

    def commented_tasks_filter(self, queryset, name, value):
        print(3, self, queryset, name, value)
        return queryset.filter(comment__author_id=self.request.user.id)

根据 filters.py 中的打印,我得到:

1 <TaskManager.filters.TaskFilter object at 0x7f87290dea90> <QuerySet [<Task: Task object>, <Task: Task object>, <Task: Task object>]> my_tasks False
2 <TaskManager.filters.TaskFilter object at 0x7f87290dea90> <QuerySet []> tasks_for_me True
3 <TaskManager.filters.TaskFilter object at 0x7f87290dea90> <QuerySet []> commented_tasks False

所以我有两个问题:首先,为什么只有第一个自定义过滤器获取查询集?另外,如何使用三个单选按钮进行过滤,这将只是返回需要查询集?

【问题讨论】:

  • 我在任务模型中看不到评论字段。另外,你能显示Tasks.objects.all().values('author','worker')的结果吗?
  • @iamkhush,结果如下:&lt;QuerySet [{'author': 1, 'worker': 2}, {'author': 1, 'worker': 2}, {'author': 1, 'worker': 3}]&gt; 评论模型现在是空的,所以我跳过它。主要问题是任务的查询集是空的。

标签: python django django-filter


【解决方案1】:

从查询集中可以清楚地看出,3 个任务的作者为 1。这也意味着您必须从用户 1 查询。因此my_task_filter 返回 3 个结果。

对于tasks_for_me_filter,您得到 0 个结果,因为没有工作人员的 id 为 1。

要解决此问题,您需要以某种方式将 user_id(您希望检查的工作人员的)传递给此查询集。也许使用请求参数。

虽然这是建议的答案 - 这并不能解决问题。请查看下面的 cmets 以获得一些提示。

【讨论】:

  • 现在,用户 ID 为 2。过滤器在过滤前获取 EMPTY 查询集。所以在这种情况下,用户 ID 无关紧要。
  • 我同意。在我看来,因为查询集是按顺序过滤的。我的意思是,由于第一个返回空的,接下来的接收空。您可以尝试更改字段的顺序然后检查输出吗?
  • 你说的对,所以我想,我应该改变解决这个问题的策略。
猜你喜欢
  • 2010-10-14
  • 2016-09-11
  • 1970-01-01
  • 1970-01-01
  • 2021-04-02
  • 1970-01-01
  • 2016-06-12
  • 2019-07-29
  • 1970-01-01
相关资源
最近更新 更多