简体   繁体   English

django-filter自定义过滤器无法获取queryset

[英]django-filter custom filter not get queryset

First of all, I'm beginner in Django-filter if you could offer best solution, I'll be glad to hear it. 首先,如果您可以提供最佳解决方案,那么我是Django过滤器的初学者,我很高兴听到它。

I need to filter QuerySet by ForignKeys' fields. 我需要按ForignKeys的字段过滤QuerySet。 And exactly author and worker . 以及确切的authorworker

Model.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)

Filters.py Filters.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)

According to prints in filters.py I get: 根据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

So I have two questions: First of all, why only first custom filter get queryset? 所以我有两个问题:首先,为什么只有第一个自定义过滤器才能获得queryset? Also, how can I make filter with three radio buttons which will be just return need queryset? 另外,如何通过三个单选按钮来制作过滤器,这些单选按钮将仅返回需要的queryset?

It is clear from the queryset that 3 tasks have author as 1. This also means that you must be querying from user 1. Hence my_task_filter returns 3 results. 从查询my_task_filter可以清楚地看到3个任务的作者为1。这也意味着您必须从用户1进行查询。因此, my_task_filter返回3个结果。

For tasks_for_me_filter you get 0 results since no worker has id 1. 对于tasks_for_me_filter您将获得0个结果,因为没有工人具有ID 1。

To fix this, you need to pass the user_id (of the worker you wish to check) to this queryset somehow. 要解决此问题,您需要以某种方式将(您要检查的工作人员的)user_id传递给此查询集。 Maybe using the request parameter. 也许使用request参数。

Although this is the suggested answer - this doesnt fix the issue. 尽管这是建议的答案-这不能解决问题。 Please look into the comments below for some hints. 请查看以下评论​​以获取一些提示。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM