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)

Наконец-то, теперь я могу спать.

Вернуться на верх