Django关联User模型的ForeignKey表现为OneToOneField如何解决
问题原因
你在TaskModel的user外键字段上设置了primary_key=True参数,Django中所有主键字段默认自带unique=True唯一约束,这就导致这个ForeignKey字段被强制加上了唯一限制,最终效果和OneToOneField完全一致,因此Django会抛出W342警告。
如果你原本设计的是一个用户可以对应多个任务的业务逻辑,给user设为主键会导致每个用户只能绑定一条任务记录,自然就出现了ForeignKey表现和OneToOne一致的问题。
解决方案
你可以根据实际业务需求选择对应方案:
- 如果你需要实现一个用户对应多个任务的常规逻辑:
直接移除user字段的primary_key=True参数即可,Django会自动为TaskModel生成名为id的自增主键字段,修改后的代码如下:class TaskModel(models.Model): user=models.ForeignKey(User,on_delete=models.CASCADE) name=models.CharField(max_length=100) start=models.DateField() end=models.DateField() note=models.CharField(max_length=300) - 如果你确实需要一个用户只能对应一条任务记录:
直接把ForeignKey替换成OneToOneField即可,既符合Django的设计规范,也能提升代码可读性:class TaskModel(models.Model): user=models.OneToOneField(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)
修改完成后重新运行makemigrations和migrate命令即可消除该警告。
内容的提问来源于stack exchange,提问作者ahmad raja
相关产品推荐
相关产品推荐

