我无法使用用户模型创建 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
字段。
【问题讨论】:
这不是错误,而是警告。ForeignKey
s 是独一无二的,基本上就是 OneToOneField
。 primary_key=True
暗示 unique=True
。
【参考方案1】:
这不是错误,而是警告。 ForeignKey
s 是独一无二的,基本上就是 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 theUser
model section of the documentation。
注意:模型通常没有
Model
后缀。因此,最好将重命名为TaskModel
Task
。
【讨论】:
以上是关于我无法使用用户模型创建 OneToOneField 和 ForeignKey 字段?的主要内容,如果未能解决你的问题,请参考以下文章
Django:扩展用户时,最好使用 OneToOneField(User) 或 ForeignKey(User, unique=True)?
Django:无法创建与一个普通模型具有一对一关系的多个模型对象
Django Model OneToOneField 无需创建额外的 _id 数据库列