在跨度关系中使用Q进行过滤

时间:2016-04-08 20:14:59

标签: django django-queryset django-orm django-q

我尝试在他们所属的项目的上下文中获取任务。使用简单的Project.objects.all(),我得到了我想要的东西。如何以最佳方式过滤此查询集?

型号:

class Project(models.Model):
    projectname_text = models.CharField('Projectname', unique=True, max_length=200)

class Task(models.Model):
    project = models.ForeignKey(Project, on_delete=models.CASCADE, 
                                related_name='tasks')
    author = models.ForeignKey(User, null=True, blank=True, related_name='author')
    editor = models.ForeignKey(User, null=True, blank=True, related_name='editor')

我尝试使用Q,但结果看起来它包含太多项目甚至是request.user错误的项目。使用Q的MAybe在这里是错误的方法吗?

在视图中查询:

project_list = Project.objects.filter(Q(tasks__author=request.user) | 
                                      Q(tasks__editor=request.user))

模板:

{% for project in project_list %}
  html
  {% for task in project.tasks.all %}
    html
  {% endfor %}
{% endfor %}

1 个答案:

答案 0 :(得分:0)

首先,您的查询条件有误。 authoreditor位于模型Task而非Project上,因此您应该这样做:

projects = Project.objects.filter(Q(tasks__author=request.user) |
                                  Q(tasks__editor=request.user))

其次,永远不要使用list作为变量名,因为它会覆盖默认的python数据结构list,因此您不能再使用list()在变量后创建列表声明。