2017-07-05 9 views
1

に私は、次の3つのモデルがあります:パス1つのクエリセット()ジャンゴ

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') 

「マルチフィールド値をフィルタ値として使用できません。」というエラーが表示されます。私はグーグルで、注釈がエラーと関係があると思った(しかし、私はまだそれなしで試していなかった)。

学生が3つ以上のタスクを持っている場合、my_tasksを使用することは価値がありますか?次のクエリはうまく動作します:

しかし、同じことを2回クエリしています。これを行う適切な方法は、最初のクエリがそのまま失敗することを考慮していますか?

答えて

0

最初のクエリでは、act_idとact_nameの2つの属性で構成されたdictが返されるため、この問題が発生しているようです。そして、2番目のクエリの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') 
関連する問題