django-filter 自定义过滤器得不到查询集
django-filter custom filter not get queryset
首先,我是 Django-filter 的初学者,如果您能提供最佳解决方案,我将很高兴听到。
我需要按 ForignKeys 的字段过滤 QuerySet。恰好 author
和 worker
.
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
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
所以我有两个问题:首先,为什么只有第一个自定义过滤器获取查询集?另外,我怎样才能用三个单选按钮制作过滤器,这将只是 return 需要查询集?
从查询集中可以清楚地看到 3 个任务的作者为 1。这也意味着您必须从用户 1 进行查询。因此 my_task_filter
returns 3 个结果。
对于 tasks_for_me_filter
你得到 0 个结果,因为没有工人有 id 1。
要解决此问题,您需要以某种方式将 user_id(您希望检查的工作人员的)传递给此查询集。也许使用请求参数。
虽然这是建议的答案 - 这并不能解决问题。请查看下面的评论以获取一些提示。
首先,我是 Django-filter 的初学者,如果您能提供最佳解决方案,我将很高兴听到。
我需要按 ForignKeys 的字段过滤 QuerySet。恰好 author
和 worker
.
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
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
所以我有两个问题:首先,为什么只有第一个自定义过滤器获取查询集?另外,我怎样才能用三个单选按钮制作过滤器,这将只是 return 需要查询集?
从查询集中可以清楚地看到 3 个任务的作者为 1。这也意味着您必须从用户 1 进行查询。因此 my_task_filter
returns 3 个结果。
对于 tasks_for_me_filter
你得到 0 个结果,因为没有工人有 id 1。
要解决此问题,您需要以某种方式将 user_id(您希望检查的工作人员的)传递给此查询集。也许使用请求参数。
虽然这是建议的答案 - 这并不能解决问题。请查看下面的评论以获取一些提示。