警告:默认情况下,未定义主键类型时使用自动创建的主键'django.db.models.AutoField'



为什么这会显示一个警告,因为它默认从用户模型中获取主键,所以我应该再次将主键声明为注册或候选模型吗。型号.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'.

当你在Django中定义一个模型而没有指定主键时,Django会自动为你创建一个主键。主键设置为一个整数。如果要覆盖字段类型,可以根据每个模型进行覆盖。

从Django 3.2开始,您现在可以在设置中自定义自动创建的主键的类型。

在Django 3.2中启动新项目时,主键的默认类型设置为64位整数BigAutoField。但是,早期版本将隐式主键的类型设置为整数。

这意味着,当您升级到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)

这是因为在Django 3.2中,主键默认不创建,您应该手动定义它们,或者您可以将其配置为在settings.py中自动创建。请注意,在新创建的Django 3.2项目中,它会自动添加到settings.py中,您不需要这样做。

这个问题已经在stackoverflow中得到了回答,这里是链接。

最新更新