在 Django 中未定义主键类型警告时使用自动创建主键

我刚刚把我的 python 从3.9.1升级到了3.9.4。当我试图运行服务器的时候。控制台对此给了我一个警告:

WARNINGS:
learning_logs.Entry: (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 LearningLogsConfig.default_auto_field attribute to point to a subclass of AutoField, e.g. 'django.db.models.BigAutoField'.
learning_logs.Topic: (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 LearningLogsConfig.default_auto_field attribute to point to a subclass of AutoField, e.g. 'django.db.models.BigAutoField'.
No changes detected in app 'learning_logs'

我能知道我该怎么补救吗。 我阅读了有关这方面的文档,但是我不明白这部分 这一页与这方面有什么关系。

Models.py

from django.db import models
from django.contrib.auth.models import User
# Create your models here.


class Topic(models.Model):
text = models.CharField(max_length = 200)
date_added = models.DateTimeField(auto_now_add = True)
image = models.ImageField(upload_to = 'backgroud_images', null = True, blank = True)
owner = models.ForeignKey(User,on_delete = models.CASCADE)
def __str__(self):
return self.text






class Entry(models.Model):
topic = models.ForeignKey(Topic,on_delete = models.CASCADE)
text = models.TextField()
date_added = models.DateTimeField(auto_now_add = True)


class Meta:
verbose_name_plural = "Entries"


def __str__(self):
return self.text[:50]
63470 次浏览

您的模型没有主键,但是它们是由 django 自动创建的。

您需要选择自动创建的主键的类型 Https://docs.djangoproject.com/en/3.2/releases/3.2/#customizing-type-of-auto-created-primary-keys (Django 3.2中新增)

要么将其添加到设置中 DEFAULT_AUTO_FIELD='django.db.models.AutoField'

或者

class Topic(models.Model):
id = models.AutoField(primary_key=True)
...

你无意中将 Django 升级到了3.2,这会发出警告,并且作为提示文本,建议你必须将 DEFAULT_AUTO_FIELD设置为文档中记录的 < a href = “ https://docs.djanggoproject.com/en/3.2/release/3.2/# customization-type-of-auto-create-basic-keys”rel = “ norefrer”> 通过这种方式,您可以在以后的版本中避免不必要的迁移 DEFAULT_AUTO_FIELD的值将改为 BigAutoField

应该将 DEFAULT_AUTO_FIELD显式设置为当前的 DEFAULT_AUTO_FIELD

DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'

你甚至可以在每个应用程序的基础上配置它(如果你希望用当前样式的主键构建新的应用程序)

from django.apps import AppConfig


class MyAppConfig(AppConfig):
default_auto_field = 'django.db.models.AutoField'
name = 'my_app'

甚至是每个模特(不鼓励)

from django.db import models


class MyModel(models.Model):
id = models.AutoField(primary_key=True)

您还应该注意版本锁定您的需求,因为您可能会在生产中引入向后不兼容的更改

在 < strong > django 3.2中新创建的项目 settings.py文件 包括:

..


# Default primary key field type
# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field


DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

并且由于您的项目是在 django 的早期版本上创建的,因此您可以根据自己的设置进行 附上这个

models.py:
class Topic(models.Model):
id = models.AutoField(primary_key=True)

primary_key=True https://docs.djangoproject.com/en/3.2/ref/models/fields/#primary-key

settings.py:
DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'

DEFAULT_AUTO_FIELD https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field

一个简单的解决办法:

Django 希望你添加由主键调用的序列号,如果你可以忽略这个警告,那么 okay Django 会自动添加主键,否则,如果你想删除这个警告,那么在你定义的模型中添加这个代码:

id = models.AutoField(primary_key=True)

例如:

class Contact(models.Model):
sno = models.AutoField(primary_key=True)
name = models.CharField(max_length=25, blank=True)
email = models.EmailField(max_length=40, blank=True)
phone = models.IntegerField()

快乐编码