Является ли лучшей практикой определение таблицы join для отношений "многие ко многим" в Django?

У меня есть следующий код:

class Tutors(models.Model):
    first_name = models.CharField(max_length=20, default=None, blank=False) #you need to add default none and blank false to enforce the Not-Null constraint
    last_name = models.CharField(max_length=20, default=None, blank=False)
    email = models.EmailField(max_length=254,default=None, blank=False)
    birth_day = models.DateField(auto_now=False, auto_now_add=False, default=False, blank=False)

    def __str__(self):
        return(self.first_name + ' ' + self.last_name)

        
class ArtSubjects(models.Model):
    subject_name = models.CharField(max_length=20, default=None, blank=False)
    tutors = models.ManyToManyField(Tutors)

    def __str__(self):
        return self.subject_name

Мой вопрос в том, должен ли я определять отношения "многие ко многим" подобным образом? Или я должен определить новый класс для таблицы?

Причина, по которой я спрашиваю, заключается в том, что я могу получить объекты из таблицы join путем запроса по классу ArtSubjects следующим образом - adobeAI.tutors.all() возвращает <QuerySet [<Tutors: Matt Aird>, <Tutors: Tom John>]>

Но я не могу придумать, как запросить объединенную таблицу по тьюторам, чтобы узнать, какие занятия ведет тот или иной тьютор.

Есть советы по этому поводу?

Таким же образом можно запрашивать тьюторов. Вот пример:

john = Tutors.objects.get(first_name="John")
john.artsubjects_set.all()

Если вы хотите иметь более читаемое имя, чем _set, добавьте related_name к полю ManyToManyField:

class ArtSubjects(models.Model):
    tutors = models.ManyToManyField(Tutors, related_name="teaches")
    ...

john.teaches.all()

Более подробную информацию вы можете найти в документации https://docs.djangoproject.com/en/3.2/topics/db/examples/many_to_many/

Это можно сделать (см. https://docs.djangoproject.com/en/3.2/topics/db/models/#extra-fields-on-many-to-many-relationships), но если вы не добавляете дополнительные данные в промежуточную модель, я бы не рекомендовал этого делать.

Django создаст промежуточную модель за кулисами. В этом случае она будет доступна как ArtSubjects.tutors.through.

Смотрите ответ @Marco о том, как запросить отношения.

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