Django Models - в DJANGO объединяются несколько эквивалентных таблиц SQL - PullRequest
0 голосов
/ 16 октября 2018

Как объединить 3 или более таблиц в django (ORM) и получить результаты?
Создано 3 модели:

1.student 2.marks 3.details

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 таблицы и получить имя студента, баллы, статус, address_city, email_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.

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Я думаю, вы должны держать это проще, а не усложнять модели, которые не будут хороши, когда у вас много данных.Держите модель студента в качестве основного класса.И сохраняйте всю другую информацию в других таблицах.

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/en/2.1/ref/models/querysets/#extra

0 голосов
/ 16 октября 2018

Некоторые предложения для данных моделей:

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 для вызова соответствующих полей в вашем шаблоне.Также используйте только те поля, которые вы хотите отобразить.

Надеюсь, это работает и для вас.Всего наилучшего:)

...