Django,用另一个表创建用户

Posted

技术标签:

【中文标题】Django,用另一个表创建用户【英文标题】:Django, relate User with another table 【发布时间】:2014-04-29 03:20:03 【问题描述】:

所以我得到了你可以在下图中看到的表格:

.

我想做的是创建一种关系,以便每个用户(django auth_user)将被注册(或能够注册)到一个“课程”,这样他就可以看到他的模块的下一个事件。

我是否必须创建另一个表并放置 2 个外键,或者这是在 'php' 中执行此操作的一种方法,并且使用 Django 更简单?有人建议我创建继承自 'User' 的 'student' 模型,该模型具有扩展行为和 一对多关系 认证。我尝试这样做,但不幸的是没有结果,因为我对 Django 和 Python 真的很陌生。

【问题讨论】:

【参考方案1】:

如果每个 auth_user(或 auth.User)都将或有机会注册课程,我将创建一个与 django User 模型具有一对一关系的“用户配置文件”模型。您可以在此模型中存储其他用户数据,包括他们注册的课程。请参阅https://docs.djangoproject.com/en/dev/topics/auth/customizing/#extending-the-existing-user-model 了解更多详情,但这里是一个示例:

class UserProfile(models.Model):
    user = models.OneToOneField('auth.User')
    course = models.ForeignKey('courseapp.Course', null=True)

您可能需要创建一个在每次保存 auth.User 对象时触发的信号,这样如果这是第一次保存 User 对象,它会自动创建 UserProfile:

from django.contrib.auth.models import User
from django.db.models.signals import post_save
from yourusersapp.models import UserProfile

def create_user_profile(sender, instance, created, **kwargs):
    # Automatically creates a UserProfile on User creation.
    if created:
        UserProfile.objects.create(user=instance)

post_save.connect(create_user_profile, sender=User)

当您查询用户对象时,您可以引用用户对象的配置文件,例如:

user_object.userprofile

然后您可以创建一个 Course 对象并通过其 UserProfile 将 user_object 间接链接到该课程:

course = Course.objects.create(name='course_name', next_field='whatever')
user_profile = user_object.userprofile
userprofile.course = course
userprofile.save()

现在您有一个用户对象,其 UserProfile 仅链接到 1 门课程。许多用户可以上同一门课程,但一个用户只能上一门课程。您还可以参考特定课程的所有用户,例如:

course = Course.objects.get(name='course_name')
course_users = course.userprofile_set.all()

HTH

【讨论】:

回答了我自己的问题,它应该位于models.py,如@Raisins 的回答here 中所述。【参考方案2】:

我认为您可以选择以下两种方式之一。

    扩展用户模型。 “学生”可能是您的新模型的好名字。它将与“用户”建立 OneToOne 关系,并与“课程”建立 ForeignKey 关系。它可以存储仅适用于学生的任何其他信息。可以在此处找到有关如何执行此操作的文档https://docs.djangoproject.com/en/1.6/topics/auth/customizing/#extending-the-existing-user-model

    创建与 Course 具有 ForeignKey 关系的自定义 User 模型。这种方法稍微复杂一些,但会产生更清晰的最终结果。文档在这里。 https://docs.djangoproject.com/en/1.6/topics/auth/customizing/#substituting-a-custom-user-model

很抱歉,我似乎只是将您发送到 Django 文档,但这两个部分都写得很好,应该很清楚地解释了事情。如果您想用示例代码发布另一个问题,我们可以尝试看看为什么您最初尝试扩展 User 模型没有奏效。顺便说一句,您的“学生”模型不应该为了扩展它而必须从用户模型继承。

【讨论】:

问题是我不会向用户模型添加任何额外的字段,所以我不确定创建自定义用户模型是否是个好主意。所以在我的情况下第一种方法更好?另外,既然将来我可能会添加“老师”,那么遵循第一种方式会不会更好?对不起,如果我让你感到困惑。 是的。我认为此时第一种方法对您来说是一种更简单(更好)的方法。特别是如果您是 Django/Python 新手。让“学生”对象工作后,添加“教师”对象应该很简单。 太棒了!那我就走第一种吧!非常感谢!我会让你知道结果!

以上是关于Django,用另一个表创建用户的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Django 创建三联表

第三百七十六节,Django+Xadmin打造上线标准的在线教育平台—创建用户操作app,在models.py文件生成5张表,用户咨询表课程评论表用户收藏表用户消息表用户学习表

C# Discord Bot 编码:创建一个发送垃圾邮件的命令,然后用另一个命令停止

搭建自己的博客:创建表,创建超级用户

Django之用户认证auth模块使用

覆盖 Django 用户模型