【问题标题】:I am not able to create OneToOneField and ForeignKey field with User model?我无法使用用户模型创建 OneToOneField 和 ForeignKey 字段?
【发布时间】: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 是独一无二的,基本上就是 OneToOneField。 primary_key=True 暗示 unique=True。

标签: python django django-models django-database


【解决方案1】:

这不是错误,而是警告。 ForeignKeys 是独一无二的,基本上就是 OneToOneField。 primary_key=True 隐含unique=True,因此TaskModel 的user 字段可以更好地转换为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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 2016-11-10
    • 2018-01-28
    • 2015-11-30
    • 2012-11-15
    • 1970-01-01
    相关资源
    最近更新 更多