[英]Django Models - SQL Equivalent multiple tables join in DJANGO
如何在Django(ORM)中聯接3個或更多表並獲取結果?
已創建3個模型:
1.學生2.成績3.詳細
class Student:
s_id = models.IntegerField(primary_key=True)
s_name = models.CharField(max_length=100)
class Marks:
school_id = models.IntegerField(primary_key=True)
s_id = models.ForeignKey(Student, on_delete=models.CASCADE)
score = models.IntegerField()
status = models.CharField(max_length=30)
class Details:
address_city = models.CharField(max_length=30)
emailid = models.EmailField()
school_id = models.ForeignKey(Marks,on_delete=models.CASCADE)
accomplishments = models.TextField()
我需要加入這3個表並獲取學生的姓名,得分,狀態,地址城市,電子郵件ID,成就。
在SQL中,我們可以這樣寫:
select s_name, score, status, address_city, email_id,
accomplishments from student s inner join marks m on
s.s_id = m.s_id inner join details d on
d.school_id = m.school_id;
請讓我知道如何使用DJANGO代碼實現相同的目的。
給定模型的一些建議:
models.py:
class Student:
name = models.CharField(max_length=100)
class Marks:
student = models.ForeignKey(Student, on_delete=models.CASCADE)
score = models.IntegerField()
status = models.CharField(max_length=30)
class Details:
address_city = models.CharField(max_length=30)
emailid = models.EmailField()
school = models.ForeignKey(Marks,on_delete=models.CASCADE)
accomplishments = models.TextField()
現在,當我們在sql中創建映射表時,創建您的映射模型:
class StundetMarksDetailsMap:
student = models.ForeignKey(Student, on_delete=models.CASCADE)
marks = models.ForeignKey(Marks, on_delete=models.CASCADE)
details = models.ForeignKey(Details, on_delete=models.CASCADE)
現在,您可以創建自己的queryset
,只要你想在views.py或者你想要的:
class StudentView(generic.DetailsView):
model = Student
template = student_details.html
//this will return all values related student
def get_queryset(self):
return StundetMarksDetailsMap.objects.filter(student=Student)
基本上,此get_queryset
返回與所選擇的stundet相關的模型的對象,使用返回的Details和Marks對象在模板中調用其對應字段。 也僅使用要顯示的字段。
希望這對您也有用。 祝一切順利 :)
我認為您應該使它保持簡單,而不是使模型復雜化,因為當您擁有大量數據時,模型並不會太好。 將學生模型作為主要班級。 並將所有其他信息存儲在其他表中。
class Student:
name = models.CharField(max_length=100)
marks = models.ForeignKey(Marks,on_delete=models.CASCADE)
school = models.ForeignKey(School,on_delete=models.CASCADE)
class Marks:
score = models.IntegerField()
status = models.CharField(max_length=30)
class Details:
address_city = models.CharField(max_length=30)
emailid = models.EmailField()
accomplishments = models.TextField()
class School:
name = models.CharField(max_length=30)
details = models.ForeignKey(Details)
現在執行以下查詢
student = Student.objects.filter(pk=student_id).filter(school_pk=school_id)
print student.name
print student.marks.score
print student.marks.status
print student.details.address_city
對於您當前的模型,很難查詢。 但是您可以嘗試編寫SQL查詢本身。 像這樣
Blog.objects.extra(
select={
'entry_count': 'SELECT COUNT(*) FROM blog_entry WHERE blog_entry.blog_id = blog_blog.id'
},
)
遵循此https://docs.djangoproject.com/zh-CN/2.1/ref/models/querysets/#extra
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.