Django ORM соединение нескольких таблиц с AbstractUser - PullRequest
0 голосов
/ 23 февраля 2020

Я погуглил, но запутался в объединении нескольких таблиц (с отношениями 1: 1, 1: n и n: m). Мои модели выглядят так:

class User(AbstractUser):
    is_student = models.BooleanField(default=False)
    is_teacher = models.BooleanField(default=False)

class Event(models.Model):
    owner_events = models.ForeignKey(User, on_delete=models.CASCADE, related_name='events')
    name = models.CharField(max_length=30)
   date = models.DateTimeField(default=timezone.now)

    def get_absolute_url(self): # defekt
        return reverse('event_detail', kwargs={'pk': self.pk})
        return self.name

    def get_event(self):
        name = escape(self.name)
        date =  escape(self.date)
        return "Name: " + str(name) + " Datum: " + str(date)

class Teacher(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    interests = models.ManyToManyField(Subject, related_name='interested_teachers') 
    matches = models.ManyToManyField(Match, related_name="teacher_matches")

    def __str__(self):
        return self.user.username

    def get_events(self):
        return "Name: " + str(self.events.name) + "Date: "

    def get_events_adr(self):
        return self.events

    def get_interests(self):
        return "Interests: " + str(self.interests.name)

Вот как выглядят таблицы в БД:

Classroom_Event

Classroom_Teacher

Classroom_User

В представлениях я хочу иметь информацию о событиях (event_id, name, date) и информацию об учителях (user_id, name) отображается. В SQL это будет примерно так:

select classroom_event.id, classroom_event.name, classroom_event.date,
classroom_user.id, classroom_user.username from classroom_event

left join classroom_user on
classroom_event.owner_events_id = classroom_user.id

left join classroom_teacher on 
classroom_user.id = classroom_teacher.user_id

1 Ответ

0 голосов
/ 23 февраля 2020

Я думаю, что нет необходимости создавать абстрактного пользователя. просто определите две модели для ученика и учителя и задайте ключ темы one_to_one для пользовательской модели по умолчанию, также нет необходимости в поле ученик / учитель !. просто для обеспечения лучшего обратного вызова от модели User к этим двум моделям, задайте related_name в поле внешнего ключа, или будет задано обратное значение по умолчанию "teacher_set".

for teacher in Teacher.objects.all():
    print(teacher.user.username)

или наоборот:

for user in User.objects.all():
   if user.teacher:
        print(user.teacher.username)
...