将一个查询集作为django中exclude()的参数传递

时间:2017-07-05 15:13:54

标签: django

我有以下三种模式:

class Student(models.Model):
    name=models.CharField(max_length=10)

class Task(models.Model):
    name=models.CharField(max_length=10)

class StudentTask(models.Model):
     student=models.ForeignKey(Student)
     task=models.ForeignKey(Task)

现在我想要的是显示他被分配到的任务列表以及他没有参加的活动列表:

         my_tasks=StudentTask.objects.annotate(act_id=F('id'),act_name=F('task__name')).values('act_id','act_name').filter(student_id=id)

 tasks=Task.objects.exclude(id__in=my_tasks).values('id','name')

其中给出错误“不能将多字段值用作过滤器值。”。我用谷歌搜索并意识到注释与错误有关(但我没有尝试没有它)。

考虑到任何给定的学生不能有三个以上的任务,是否值得尝试使用my_tasks?以下查询正常工作:

  tasks=Task.objects.exclude(id__in=StudentTask.objects.filter(student_id=id).values('task_id')

但它两次同样的问题。考虑到第一个查询会失败,这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

似乎问题是因为在第一个查询中,您将返回一个由两个属性填充的dict:act_id和act_name。然后在第二个查询中的exclude()过滤器中使用它。试试这个:

my_tasks=StudentTask.objects.annotate(act_id=F('id'),act_name=F('task__name')).values('act_id','act_name').filter(student_id=id)

my_task_ids = [d['act_id'] for d in my_tasks]

tasks=Task.objects.exclude(id__in=my_task_ids).values('id','name')