1
私は3つのテーブル:Student(id, username)
,Skill(id, value)
およびStudentSkill(id, student_id, skill_id)
を持っています。彼らはそのようloook Djangoのモデル(ショートバージョン)では
:いくつかの同じパラメータを持つ行を選択
class Student(models.Model):
username = models.CharField(max_length = 50, unique = True)
class Skill(models.Model):
value = models.CharField(max_length = 50, unique = True)
class StudentSkill(models.Model):
student = models.ForeignKey(Student, on_delete=models.CASCADE)
skill = models.ForeignKey(Skill, on_delete=models.CASCADE)
私は特定のスキルを持つ学生のクエリセットを返す要求を記述する必要があります。
例えば、私は、データベース内の次のデータを有する:
Student
id | username
------ | ------
1 | user1
2 | user2
3 | user3
Skill
id | value
------ | ------
1 | s1
2 | s2
3 | s3
StudentSkill
id | student_id | skill_id
------ | ---------- | --------
1 | 1 | 1
2 | 2 | 1
3 | 2 | 2
4 | 3 | 1
5 | 3 | 2
6 | 3 | 3
user1
s1
と
s2
)
user3
3つのスキルを有する:(
user2
(
s1
)
2つのスキルを有します
s1
,
s2
および
s3
)
私はスタテンs2
もし
>user1
、user2
とuser3
- - 私は>user3
- >user2
とuser3
s1
とs3
場合s1
場合s1
とs2
を持っているTS、私はuser2
とuser3
を取る必要がありますこの問題を解決する2つの方法を知っているが、どちらも悪いと思う。
まず:
students = Student.objects.raw('''
SELECT t1.* FROM (
SELECT student.* FROM student
INNER JOIN studentskill ON studentskill.student_id = student.user_id
INNER JOIN skill ON skill.id = studentskill.skill_id
WHERE skill.id = 1
) AS t1
INNER JOIN studentskill ON studentskill.student_id = t1.user_id
INNER JOIN skill ON skill.id = studentskill.skill_id
WHERE skill.id = 2
''')
セカンド(私はこのコードをチェックしていない、それはバグを持っている場合があります):
students = Student.objects.filter(studentskill__skill__id = 1
).select_related('studentskill', 'skill'
).only('student', 'studentskill', 'skill__id')
students.filter(studentskill__skill__id = 2)
1つの質問: – Sskeptix
OK ..それから..質問.. – scaisEdge
または私の答えが正しい場合はそれをマークしてください...どのようにここに表示 http://meta.stackexchange.com/questions/5234/how-does-受付中の回答 – scaisEdge