我无法使用用户模型创建 OneToOneField 和 ForeignKey 字段?

Posted

技术标签:

【中文标题】我无法使用用户模型创建 OneToOneField 和 ForeignKey 字段?【英文标题】:I am not able to create OneToOneField and ForeignKey field with User model? 【发布时间】:2021-12-23 10:29:43 【问题描述】:

我有这两个模型

class TaskModel(models.Model):
    user=models.ForeignKey(User,on_delete=models.CASCADE,primary_key=True)
    name=models.CharField(max_length=100)
    start=models.DateField()
    end=models.DateField()
    note=models.CharField(max_length=300)

class ProfileModel(models.Model):
    user=models.OneToOneField(User,on_delete=models.CASCADE,
    primary_key=True)
    img=models.ImageField(upload_to='profileimg',blank=True)
    desc=models.TextField(max_length=500)
    occupation=models.CharField(max_length=100)
    martial=models.CharField(max_length=50)

但是当我运行makemigrations 命令时,它会显示这个错误::

app.TaskModel.users: (fields.W342) 在 ForeignKey 上设置 unique=True 与使用 OneToOneField 的效果相同。 提示:ForeignKey(unique=True) 通常由 OneToOneField 提供更好的服务。

这是我的问题,我将TaskModel 设置为ForeignKey,但它的工作方式类似于OneToOne 字段。

【问题讨论】:

这不是错误,而是警告。 ForeignKeys 是独一无二的,基本上就是 OneToOneFieldprimary_key=True 暗示 unique=True 【参考方案1】:

这不是错误,而是警告ForeignKeys 是独一无二的,基本上就是 OneToOneFieldprimary_key=True 隐含unique=True,因此TaskModeluser 字段可以更好地转换为OneToOneField

from django.conf import settings

class TaskModel(models.Model):
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        primary_key=True
    )
    name = models.CharField(max_length=100)
    start = models.DateField()
    end = models.DateField()
    note = models.CharField(max_length=300)

注意:通常使用settings.AUTH_USER_MODEL [Django-doc] 引用用户模型比直接使用User model [Django-doc] 更好。更多信息可以查看referencing the User model section of the documentation。


注意:模型通常没有Model 后缀。因此,最好将 TaskModel 重命名为 Task

【讨论】:

以上是关于我无法使用用户模型创建 OneToOneField 和 ForeignKey 字段?的主要内容,如果未能解决你的问题,请参考以下文章

Django:扩展用户时,最好使用 OneToOneField(User) 或 ForeignKey(User, unique=True)?

Django:无法创建与一个普通模型具有一对一关系的多个模型对象

Django Model OneToOneField 无需创建额外的 _id 数据库列

通过扩展用户模型中的电话字段登录

隐藏但需要 OneToOneField 的 Django 创建 ModelForm

如何编写迁移以使用 ManyToManyField 更改模型的主键