I googled but got confused in multiple table join (with 1:1, 1:n, and n:m relations). My models looks like this:
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)
Here this is how the tables look like in the db:
In views I want to have events (event_id, name, date) and teachers information (user_id, name) displayed. In SQL it would be something like this:
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
I think there is no need to to create abstract user. just define two model for student and teacher and give theme one_to_one key to default User model, also no need for is student/teacher field too!. just for enabling a better reverse call from User model to this two models, give a related_name in foreign key field, or there will be default "teacher_set" reverse.
for teacher in Teacher.objects.all():
print(teacher.user.username)
or in reverse:
for user in User.objects.all():
if user.teacher:
print(user.teacher.username)