簡體   English   中英

Django模型-DJANGO中的SQL等效多個表聯接

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM