Django ORM 多表连接与 AbstractUser
Posted
技术标签:
【中文标题】Django ORM 多表连接与 AbstractUser【英文标题】:Django ORM multiple table join with AbstractUser 【发布时间】:2020-02-23 15:01:46 【问题描述】:我在 Google 上搜索过,但对多表连接(具有 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)
这是表在 db 中的样子:
Clas-s-room_Event
Clas-s-room_Teacher
Clas-s-room_User
在视图中,我希望显示事件(event_id、姓名、日期)和教师信息(user_id、姓名)。在 SQL 中会是这样的:
select clas-s-room_event.id, clas-s-room_event.name, clas-s-room_event.date, clas-s-room_user.id, clas-s-room_user.username from clas-s-room_event left join clas-s-room_user on clas-s-room_event.owner_events_id = clas-s-room_user.id left join clas-s-room_teacher on clas-s-room_user.id = clas-s-room_teacher.user_id
【问题讨论】:
【参考方案1】:我认为没有必要创建抽象用户。 只需为学生和教师定义两个模型,并将主题 one_to_one 键赋予默认用户模型,也不需要学生/教师字段! 只是为了让用户模型更好地反向调用这两个模型,在外键字段中给出一个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)
【讨论】:
感谢您的回复。抽象用户的设计原因是: • 在所有帐户之间共享公共资源(例如登录、注销、密码重置、密码更改)——我不希望它们分布在多个表中。 • 自定义用户模型而不依赖于OneToOne 模型。因此,我想保持模型不变。是否还有 ORM 解决方案?非常感谢。 感谢分享。那么,带有“事件”表的 JOIN 会是什么样子?非常感谢。以上是关于Django ORM 多表连接与 AbstractUser的主要内容,如果未能解决你的问题,请参考以下文章
django ORM model filter 条件过滤,及多表连接查询反向查询,某字段的distinct
django ORM model filter 条件过滤,及多表连接查询反向查询,某字段的distinct