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

时间:2021-06-01 05:23:18

标签: django django-models

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

2 个答案:

答案 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