Django: Как запросить две модели с отношением друг к другу, сохраняя при этом отношение к родительской модели?
У меня есть родительская модель Profile
и две другие модели Courses
и Course_student
.
class Profile(models.Model):
...
first_name = models.CharField(verbose_name=_('First Name'), max_length=255, null=True, blank=True, )
middle_name = models.CharField(verbose_name=_('Middle Name'), max_length=255, null=True, blank=True)
last_name = models.CharField(verbose_name=_('Last Name'), max_length=255, null=True, blank=True)
...
class Courses(models.Model):
YESNO = (
('Yes', 'Yes'),
('No', 'No'),
)
profile = models.ManyToManyField('Profile', related_name='course_profile', verbose_name=_('Profile'))
course_taken = models.CharField(verbose_name=_('Course'), max_length=255)
name_of_school = models.CharField(verbose_name=_('Name of School'), max_length=255)
school_location = models.CharField(verbose_name=_('School Location'), max_length=255)
period_of_attendance_from = models.DateField(verbose_name=_('Period of Attendance (From)'), max_length=255)
period_of_attendance_to = models.DateField(verbose_name=_('Period of Attendance (To)'), max_length=255)
nr_students = models.IntegerField(verbose_name=_('Total Number of Students'), null=True, blank=True)
created_on = models.DateTimeField(auto_now_add=True)
modified_on = models.DateTimeField(auto_now=True)
class Meta:
verbose_name = _('Course')
verbose_name_plural = _('Course')
def __str__(self):
return '%s' % (self.course_taken)
class Course_student(models.Model):
YESNO = (
('Yes', 'Yes'),
('No', 'No'),
)
course = models.ForeignKey('Courses', related_name='course_student_details', on_delete=models.DO_NOTHING, verbose_name=_('Course'), blank=True, null=True)
profile = models.ForeignKey('Profile', related_name='course_student_profile', on_delete=models.DO_NOTHING, verbose_name=_('Profile'), blank=True, null=True)
standing = models.IntegerField(verbose_name=_('Standing'), null=True, blank=True)
grade = models.CharField(verbose_name=_('Grade'), max_length=255, null=True, blank=True)
completed = models.CharField(verbose_name=_('Completed'), choices=YESNO, max_length=255)
class Meta:
verbose_name = _('Student Details')
verbose_name_plural = _('Student Details')
def __str__(self):
return '%s' % (self.course)
admin.py
class CourseUploaderInline(admin.StackedInline):
model = CourseUploader
extra = 1
class CourseStudentInline(admin.StackedInline):
model = Course_student
extra = 1
@admin.register(Courses)
class CoursesAdmin(admin.ModelAdmin):
inlines = [Course_studentInline, CorseUploaderInline,]
Course_student
имеет Foreignkey
к Courses
и Profile
- Как вы видите,
Course_student
имеет поля дляprofile
,standing
,grade
иcompleted
, в них будет храниться информация о студенте для конкретного курса и конкретного профиля/студента. В то время какCourses
имеетM2M
кProfile
, чтобы я мог пометить студента, какие курсы у него/нее есть.Profile
будет содержать основную информацию о студенте .
Я пытаюсь объединить Courses
и Course_student
путем фильтрации с помощью Profile
, например:
view.py
def profile(request, pk):
profile = Profile.objects.filter(profile=pk)
course = Course.objects.filter(profile=pk) # I tried here the select_related()
P.S. Я новичок в Django и Python, надеюсь, вы будете ко мне снисходительны :) TIA Также приветствуются предложения о том, чего я пытаюсь достичь.
После некоторого поиска неисправностей в моем наборе запросов с использованием select_related()
, я обнаружил, что проблема в синтаксисе моего шаблона, который отображает" комбинацию course
и course_student
списка
В своем шаблоне я использовал синтаксис {{ course.name_of_school }}
вместо {{ course.course.name_of_school }}
.
Использование select_related()
является правильным способом соблюдения обратной зависимости. Я просто пропустил синтаксис в шаблоне
course = Course_student.objects.select_related('course').filter(profile=pk)
Наконец-то, теперь я могу спать.