我是 Django 的新手,出于某种奇怪的原因,我的模型没有创建数据库表,并且完全不知道为什么。当我运行命令:“python manage.py makemigrations”时,控制台输出显示以下内容:
Migrations for 'auctions':
auctions/migrations/0001_initial.py
- Create model User
- Create model Item
这对我来说似乎是准确的。然后我运行命令:“python manage.py migrate”,控制台输出中显示以下内容。
Operations to perform:
Apply all migrations: accounts, admin, auctions, auth, contenttypes, sessions
Running migrations:
No migrations to apply.
查看数据库,果然没有创建任何内容。以下是我的 models.py 文件的输出:
from django.contrib.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
def __str__(self):
return f"{self.first_name}"
class Item(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="item_list")
title = models.CharField(max_length=64)
description = models.CharField(max_length=256, blank=True)
img_url = models.CharField(max_length=256, blank=True)
starting_bid = models.DecimalField(decimal_places=2, max_digits=8)
category = models.CharField(max_length=24, default='No Category')
status = models.BooleanField(default=True)
def __str__(self):
return f"{self.title}, {self.description}"
这是命令的输出:“python manage.py showmigrations”
Glass-Bids nobility$ python manage.py showmigrations
access
(no migrations)
accounts
[X] 0001_initial
admin
[X] 0001_initial
[X] 0002_logentry_remove_auto_add
[X] 0003_logentry_add_action_flag_choices
auctions
[X] 0001_initial
auth
[X] 0001_initial
[X] 0002_alter_permission_name_max_length
[X] 0003_alter_user_email_max_length
[X] 0004_alter_user_username_opts
[X] 0005_alter_user_last_login_null
[X] 0006_require_contenttypes_0002
[X] 0007_alter_validators_add_error_messages
[X] 0008_alter_user_username_max_length
[X] 0009_alter_user_last_name_max_length
[X] 0010_alter_group_name_max_length
[X] 0011_update_proxy_permissions
[X] 0012_alter_user_first_name_max_length
contenttypes
[X] 0001_initial
[X] 0002_remove_content_type_name
sessions
[X] 0001_initial
答案 0 :(得分:2)
是的,就像我想的那样。您可能听从了某人的建议,即“删除所有迁移并删除表”,现在 django_migrations
表中仍有一条记录表明拍卖应用程序的“0001_initial”已被应用。由于 0001_initial 是为没有迁移的应用反复创建的名称,因此您无法摆脱这种情况。
首先,使用您最喜欢的数据库工具,删除违规行:
melvyn=# SELECT app, name FROM django_migrations WHERE name='0001_initial';
app | name
--------------+--------------
contenttypes | 0001_initial
auth | 0001_initial
admin | 0001_initial
sessions | 0001_initial
account | 0001_initial
sites | 0001_initial
main | 0001_initial
所以在你的情况下:DELETE FROM django_migrations WHERE app='auctions';
现在,如果您运行 migrate,将应用迁移。
对于下一次:如果在没有明确解释的情况下给出此建议,则永远不要删除所有迁移。这是一种浪费时间的做法,而且只在有限的情况下有帮助,而且往往是导致问题的原因。
migrate 命令也可以回滚迁移,因此如果您对任何迁移不满意,请执行以下操作:
% python manage.py migrate auctions zero
(是的,字面意思是单词 zero
)。这将还原应用的所有迁移。
如果您对最近的更改不满意,请将其设置回一个数字。因此,如果应用有 3 次迁移,请执行以下操作:
% python manage.py migrate auctions 0002
然后您可以丢弃迁移 0003,更改模型并再次运行 makemigrations 并再次迁移。
这样,django 对应用迁移的假设与您的代码保持同步。