【问题标题】:Save Foreign Key between profile model and user model在配置文件模型和用户模型之间保存外键
【发布时间】:2014-02-14 21:27:23
【问题描述】:

迈出django's (1.5) auth 功能的第一步,到目前为止遇到了很多麻烦,只是尝试将用户的电子邮件地址(这是用户模型中的用户名字段)作为ForeignKey 在配置文件模型中拉入@ 987654323@。

两个问题:

  1. 这是当前外键的最佳实践方式吗 配置文件模型中的用户详细信息?请注意,我不是要保存 新用户,只需将他们的个人资料详细信息关联回他们的 经过身份验证的用户对象 (CustomUser)。当用户到达 下面的视图,它们已经通过了身份验证。
  2. 需要对以下内容进行哪些更改才能使其正常工作 应该吗?

注意,在走到这一步之前,我遇到了几个user_id 不能为空必须是 CustomUser 对象的实例错误,我现在什么也没看到一旦我被重定向到/profile/,就会被保存在数据库中。

# view

@login_required
def profile_setup_specialist(request):
    if request.method == 'POST':
        current_user = CustomUser.objects.get(email = request.user.email)
        posted_form = SpecialistCreationForm(request.POST, instance=current_user)
        if posted_form.is_valid():
            profile = posted_form.save(commit=False)
            profile.user = current_user
            profile.save()
            return HttpResponseRedirect('/profile/')

            # ..


# profile model

class Specialist(models.Model):

    user = models.ForeignKey(CustomUser, related_name='Specialist')
    foo = models.CharField(max_length=100)
    # ...

    def __unicode__(self):
        return self.foo

 # form

class SpecialistCreationForm(forms.ModelForm):

    class Meta:
        model = Specialist
        exclude = ['user']


# custom user model

class CustomUser(AbstractBaseUser, PermissionsMixin):

    email           = models.EmailField(
                        verbose_name='email address',
                        max_length=255,
                        unique=True,
                        db_index=True,
                        )

    # ..

    objects = CustomUserManager()

    USERNAME_FIELD  = 'email'
    REQUIRED_FIELDS = ['first_name', 'last_name', 'state']

    def __unicode__(self):
        return self.email

【问题讨论】:

    标签: django foreign-keys models user-profile


    【解决方案1】:

    我知道编写自定义用户模型并不好玩,这涉及编写/扩展很多自定义表单,例如 question。如果我要坚持普通用户模型,我会说专家模型与用户具有 OneToOne 关系,

    类专家(models.Model):

    user = models.OneToOneField(User)
    

    所以你可以像这样查询个人资料request.user.specialist

    【讨论】:

    • 谢谢,但是自定义用户模型实际上工作正常,我可以使用 request.user.email 成功获取用户的电子邮件地址,这是通过 FK 与用户模型的关联让我感到困惑起来。
    【解决方案2】:

    按照here 的建议,通过在 SQLite DB 中四处挖掘找到了这些问题的解决方案。

    manage.py sqlall 命令显示如下,其中 Django 自动创建的模型隐藏的id 字段被指定为PRIMARY KEY

    BEGIN;
    CREATE TABLE "profiles_specialist" (
        "id" integer NOT NULL PRIMARY KEY,
        "user_id" integer NOT NULL REFERENCES "auth2_customuser" ("id"),
    

    隐藏的 id 字段不知何故失去了它的 PK 状态,并且仅设置为 INTEGER,每次保存新对象时都无法自动递增。

    需要将此字段重置为INTEGER PRIMARY KEY,然后一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-17
      • 1970-01-01
      • 2011-03-26
      • 2023-03-29
      • 2012-08-04
      • 1970-01-01
      • 2017-11-07
      相关资源
      最近更新 更多