使用与默认用户模型具有外键关系的 Django 模型

Posted

技术标签:

【中文标题】使用与默认用户模型具有外键关系的 Django 模型【英文标题】:Using a Django model that has a foreign key relation to the default User model 【发布时间】:2014-05-15 20:47:52 【问题描述】:

我正在编写一个 Django 程序,其中部门/职位字段与用户模型相关联。在注册页面上,一个人需要输入名字/姓氏、电子邮件、用户名、密码,这些是默认的用户模型字段,以及他们的部门和职位。

然后下面是我创建的两个模型。

class Department(models.Model):
    department_id = models.AutoField(primary_key=True)
    department_name = models.CharField(max_length=100, unique=True)
    is_active = models.BooleanField(default=True)

class Position(models.Model):
    position_id = models.AutoField(primary_key=True)
    position_name = models.CharField(max_length=100)
    department = models.ForeignKey(Department)
    user = models.OneToOneField(User, blank=True, related_name="position")

在views.py中,相关的视图是这样的:

def sign_up_in(request):
    global user
    post = request.POST
    if post['email'] is u'' or post['password'] is u'':
        msg = 'Please check sign-up input forms'
        return render_to_response('none.html', 'msg': msg)
    else:
        if not user_exists(post['email']):
            user = create_user(username=post['email'], email=post['email'], password=post['password'])
        user.first_name=post['first']
        user.last_name=post['last']
        **user.position.position_name=post['position']**
        user.department=post['department']
        user.is_staff = True
        user.save()

        msg = 'Sign Up OK    ' + user.first_name + '  ' + user.last_name
    else:
        msg = 'Existing User'
    return render_to_response('login.html', 'msg': msg)

当我在上面的 views.py 中添加粗体行时,我开始收到错误“未提供异常”。我应该对模型和视图进行哪些更改? 另外,在这行代码中,user = create_user(username=post['email'], email=post['email'], password=post['password']),应该如何表达外键关系呢?

【问题讨论】:

【参考方案1】:

简单的答案是user.position 还不存在。

让我们分解它以使其工作。

def sign_up_in(request):
    ...
    post = request.POST
    ... # Your if block

        # 1. Create your user.
        user = User.objects.create_user(post['email'], post['email'], post['password'])
        user.first_name = post['first']
        user.last_name = post['last']
        user.is_staff = True
        user.save()
        # 2. Create/get your department.
        dept, created = Department.objects.get_or_create(department_name=post['department'])
        # 3. Create your position
        position = Position.objects.create(department=dept, user=user, position=post['position'])
    ...

注意User.objects.create_user()Foo.objects.create()会自动保存对象,所以如果你添加更多数据,你只需要再次保存(如上面的用户)。

附带说明,虽然这将解决您遇到的问题,但我建议您放弃此特定视图并使用 Form 类来处理此问题。表单类将允许您以更简单的方式处理大量此类内容,并提供一些急需的验证方法。您可以在此处查看相关文档:https://docs.djangoproject.com/en/1.6/topics/forms/

【讨论】:

以上是关于使用与默认用户模型具有外键关系的 Django 模型的主要内容,如果未能解决你的问题,请参考以下文章

Django - 显示结果信息,同时使用具有多个外键关系的模型优化数据库查询

django模型在具有外键的字段中没有列错误

关于自定义用户模型的 Django 最佳实践

Django Rest API,如何为 2 个模型条目创建 post api,并具有与模型关联的外键

如何根据具有外键关系的另一个模型更新 Django 模型的字段

Django - 夹具中的外键