Python 3.x 在Django中未定义主键类型警告时使用的自动创建主键
我刚刚将python从3.9.1更新到3.9.4。当我试图运行服务器时。控制台就此向我发出警告:Python 3.x 在Django中未定义主键类型警告时使用的自动创建主键,python-3.x,django,Python 3.x,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
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]
您的模型没有主键。但它们是由django自动创建的 您需要选择自动创建的主键的类型 (Django 3.2中新增) 或者将其添加到settings.py
DEFAULT\u AUTO\u FIELD='django.db.models.AutoField'
或
您无意中将Django更新为3.2,该版本警告您,提示文本建议您必须将
DEFAULT\u AUTO\u字段设置为
这样,您就可以避免在将来的版本中进行不必要的迁移
DEFAULT\u AUTO\u字段的值将更改为BigAutoField
您应该将DEFAULT\u AUTO\u字段
显式设置为当前DEFAULT\u AUTO\u字段
值
DEFAULT\u AUTO\u FIELD='django.db.models.AutoField'
您甚至可以根据每个应用程序对其进行配置(如果您希望使用当前样式的主键构建新应用程序)
甚至每种型号(已分类)
您还应该注意版本锁定您的需求,因为您可能会在生产中引入向后不兼容的更改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\u key=True
DEFAULT\u AUTO\u字段
一个简单的解决方案:
Django希望您添加主键调用的序列号,如果您可以忽略此警告,则OK 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()
快乐编码我在哪里可以将其添加到设置中。这可以添加到任何地方或开始或结束?任何地方,但只需添加到结尾谢谢!!!!!!请将控制台日志作为文本而不是屏幕截图更新您的答案,好吗?@Nuts如何从命令提示符复制文本?能否更新您的答案以包含解释?
models.py:
class Topic(models.Model):
id = models.AutoField(primary_key=True)
settings.py:
DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'
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()