为什么这会显示警告,因为它默认从用户模型中获取主键,所以我还应该再次将主键声明为注册或候选模型。 模型.py
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Registration(models.Model):
fname = models.CharField(max_length=30)
lname = models.CharField(max_length=30)
# phone = models.BigIntegerField(max_length=10,primary_key=True)
dob=models.DateField()
user = models.OneToOneField(User,on_delete=models.CASCADE,primary_key=True)
def __str__(self):
return self.fname
class candidate(models.Model):
full_name = models.CharField(max_length=30)
position = models.CharField(max_length=30)
total_vote = models.IntegerField(default=0)
def __str__(self):
return "{} -- {}".format(self.full_name,self.position)
出现问题
WARNINGS:
poll.candidate: (models.W042) Auto-created primary key used when not defining a primary key type, by default 'django.db.models.AutoField'.
HINT: Configure the DEFAULT_AUTO_FIELD setting or the PollConfig.default_auto_field attribute to point to a subclass of AutoField, e.g. 'django.db.models.BigAutoField'.
答案 0 :(得分:3)
当你在 Django 中定义模型时没有指定主键,Django 会自动为你创建一个主键。主键设置为整数。如果您想覆盖字段类型,您可以在每个模型的基础上进行。
从 Django 3.2 开始,您现在可以在设置中自定义自动创建的主键的类型。
在 Django 3.2 中启动新项目,主键的默认类型设置为 BigAutoField,它是一个 64 位整数。但是,早期版本将隐式主键的类型设置为整数。
这意味着当您升级到 3.2 时,您将开始看到有关您没有明确定义的主键类型这一事实的警告。满足 Django 对显式设置的主键类型的要求很容易,但您还需要选择是否要将主键字段类型从整数升级为 64 位整数。
有几种方法可以解决这个问题。广义上讲,它们分为两类
在设置中配置 DEFAULT_AUTO_FIELD
打开项目的 settings.py 并在文件底部添加一个新行
DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'
按应用设置
如果您更喜欢基于每个应用程序而不是整个项目来设置字段类型,您可以在 apps.py 中指定它。
from django.apps import AppConfig
class MyappConfig(AppConfig):
default_auto_field = 'django.db.models.AutoField'
name = 'Myapp'
在每个模型的基础上设置 AutoField 或 BigAutoField
如果您更喜欢更细粒度的控制,您可以设置每个模型 id 字段。
class Model1(models.Model):
id = models.BigAutoField(primary_key=True)
答案 1 :(得分:1)
这是因为在 django 3.2 中默认不创建主键,您应该手动定义它们,或者您可以在 settings.py
中将其配置为自动创建。
请注意,在新创建的 django 3.2 项目中,它已添加到您的 settings.py
中,您无需执行此操作。
这个问题已经在 stackoverflow 中得到了回答,这里是 link。