在旧数据库中,slug字段不是唯一的,因此会创建重复项。现在我要迁移子弹字段unique = True。
slug = models.CharField(max_length=255, unique=True)
$ python manage.py migrate
django.db.utils.IntegrityError: (1062, "Duplicate entry 'some-x-slug' for key 'some_model_slug_6c7ae6ae040a5e98_uniq'")
Run Code Online (Sandbox Code Playgroud)
django迁移时是否有可能检测到重复的子弹,我想object_id在该slug字段的末尾添加,以使该子弹唯一。
有没有解决上述问题的简便方法
从现有数据库开始,我想更新它的架构。我改变了我的一个模型,然后运行
python manage.py makemigrations myapp
Run Code Online (Sandbox Code Playgroud)
它创建迁移,正确定义新表和列。示例输出:
Migrations for 'myapp':
0001_initial.py:
- Create model Foo
- Add field Bar
- ...
Run Code Online (Sandbox Code Playgroud)
然后我应用迁移:
python manage.py migrate --database mydb
Run Code Online (Sandbox Code Playgroud)
我得到这个输出:
Operations to perform:
Apply all migrations: admin, myapp, contenttypes, sessions, auth
Running migrations:
Rendering model states... DONE
Applying admin.0002_logentry_remove_auto_add... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Run Code Online (Sandbox Code Playgroud)
它似乎奏效了。Git告诉我“mydb”对应的sqlite文件已经改变了。但是,它没有将我的新表和列放在里面,而是删除了内容,留下了带有旧架构的空表。
我究竟做错了什么 ?
所以我在我的数据库中删除了一个表,我想要它回来。重新运行迁移给出错误表不存在。经过一番狩猎后,我了解到我可以删除 django_migrations 中所有应用名称为我的应用的内容。所以我这样做了,重新迁移它开始工作然后抱怨没有删除的表。
我不知道如何重新找回一张桌子并保持一切原样......无论如何要这样做?
我不在乎数据库中 90% 的数据,只关心几个表和字段。我放下的桌子我不关心数据。
所以我在models.py中犯了以下愚蠢的错误:
caption_on = models.BooleanField(default='true')
Run Code Online (Sandbox Code Playgroud)
当我运行“makemigrations”和“migrate”时出现以下错误
django.core.exceptions.ValidationError: ["'true' value must be either True or False."]
Run Code Online (Sandbox Code Playgroud)
所以我通过将我的 models.py 行更改为
caption_on = models.BooleanField(default=True)
Run Code Online (Sandbox Code Playgroud)
但这又给了我同样的 django.core.exceptions.ValidationError。就像我的 models.py 没有更新。即使我删除 models.py 中的行,也会出现错误。
任何人都知道如何解决这个问题?
python django django-models django-migrations django-model-field
我正在创建一个数据迁移,并且new_app可以将其回滚。
# This is `new_app` migration
class Migration(migrations.Migration):
dependencies = [
]
operations = [
migrations.RunPython(import_data, reverse_code=delete_data)
]
Run Code Online (Sandbox Code Playgroud)
此迁移将一些数据添加到其他应用程序中定义的模型中:my_other_app。要导入我想要更新或删除记录的模型,我使用apps.get_model()方法。
# This is `new_app` migration
def import_data(apps, schema_editor):
model = apps.get_model('my_other_app', 'MyModel')
Run Code Online (Sandbox Code Playgroud)
当我应用迁移时,它就像魅力一样。但是当我运行尝试回滚迁移时,出现:~> manage.py migrate new_app zero异常:LookupError: No installed app with label 'my_other_app'.回滚代码中的模型导入:
# This is `new_app` migration
def delete_data(apps, schema_editor):
schema_model = apps.get_model('my_other_app', 'MyModel')
Run Code Online (Sandbox Code Playgroud)
模型导入的代码是一样的,但是为什么迁移回滚时不起作用?现在我import在回滚期间有一个使用直接模型的解决方法。不知道会不会给以后带来麻烦。
如何从视图中查询django_migrations表?例如(我尝试了什么,当然不工作)
from django.db import migrations
latest_migration = migrations.objects.all().order_by('-applied')[0]
Run Code Online (Sandbox Code Playgroud)
如果可能的话,应该如何进行?
我是 django 的新手,我创建了一个项目和应用程序,我想将我的项目连接到 mongodb。当我输入python manage.py migrate命令时,我遇到了下面提到的错误。
我删除了数据库并清除了 django_migration 表中的所有迁移,并删除了创建的迁移文件夹中的迁移文件。仍然得到同样的错误。
请帮我解决一下这个。提前致谢
错误:
raise TypeError("documents must be a non-empty list")
TypeError: documents must be a non-empty list
Run Code Online (Sandbox Code Playgroud)
上述异常是以下异常的直接原因:
djongo.sql2mongo.SQLDecodeError: FAILED SQL: INSERT INTO "django_migrations" ("app", "name", "applied") VALUES (%(0)s, %(1)s, %(2)s)
Version: 1.2.31
Run Code Online (Sandbox Code Playgroud)
设置.py
DATABASES = {
'default': {
'ENGINE': 'djongo',
'NAME': 'DB_name',
'HOST':'localhost',
# 'PORT': 27017,
# 'USER':'',
# 'PASSWORD':''
},
Run Code Online (Sandbox Code Playgroud)
模型.py
from django.db import models
# Create your models here.
class dummy(models.Model):
name= models.CharField(max_length=100, blank=True, null= True)
Run Code Online (Sandbox Code Playgroud) 我正在 Heroku 上运行 Django,具有零停机功能。这意味着在部署期间,同一数据库上运行两个版本的代码(旧版和新版)。这就是为什么我们需要避免任何向后不兼容的迁移。
是否有可能从给定模型上的 Django 查询中排除字段?
假设我们有一个模型(版本 1):
class Person(models.Model):
name = models.CharField()
address = models.TextField()
Run Code Online (Sandbox Code Playgroud)
在未来的某个时间,我们希望将地址移动到单独的表中。我们知道我们不应该删除旧代码要工作的字段,因此 Person 模型可能看起来像(版本 2):
class Person(models.Model):
name = models.CharField()
address = models.ForeignKey(Address)
_address = models.TextField(db_name='address')
Run Code Online (Sandbox Code Playgroud)
这样,如果旧代码查询地址,即使数据库已迁移,它也会从 Person 表中获取地址(这将是旧值,但假设这不是一个大问题)。
现在我如何才能安全地删除_address字段?如果我们部署版本 3 并_address删除字段,则版本 2 的代码仍将尝试_address在 select 上获取,即使它没有在任何地方使用,并且会失败并出现“无此类列”异常。
有没有办法防止这种情况,并在版本 2 的代码中将某些字段标记为“不可获取”?所以版本 2 不会删除字段,但不会再获取它,版本 3 将删除字段。
python django database-migration django-orm django-migrations
我问这个问题是因为当我使用使用MPPT模型的django-hordak时,我遇到了django.db.utils.IntegrityError: null value in column \xe2\x80\x9clft\xe2\x80\x9d违反非空约束。
\n\n提出的一些解决方案虽然hacky违背了惯例,但确实有效。
基础
\n\n在 django 中,当编写自定义迁移时,例如创建基线数据时。
\n\ndef forward_func(apps_registry, schema_editor):\n Model = apps_registry.get_model(\'app_name\', \'ModelName\')\n Model.objects.create(**{\'field_1\': \'field_1\', \'field_2\': \'field_2\')\n # Do whatever you want with my Model \nRun Code Online (Sandbox Code Playgroud)\n\n在我的情况下,django-hordak 具有帐户模型。.objects.create(**data)\nraises the上面指定的数据库上的 IntegrityError 。
建议的解决方案
\n\n建议的解决方案之一是直接导入模型。
\n\ndef forward_func(apps_registry, schema_editor):\n # Model = apps_registry.get_model(\'app_name\', \'ModelName\')\n # lets forget about importing the standard way because it will raise integrity error.\n\n from app_name.models import …Run Code Online (Sandbox Code Playgroud) 创建模型的第一个条目抛出错误
我执行了以下命令来迁移
manage.py makemigrations
manage.py migrate
Run Code Online (Sandbox Code Playgroud)
在我执行这些命令以在数据库中创建第一个“数据”之后,一切正常
manage.py shell
from sms.models import Post
from django.contrib.auth.models import User
post_1 = Post(name="testname", email="testemail", gender="Monsieur", number="23233", author=User)
Run Code Online (Sandbox Code Playgroud)
它给了我这个错误:
ValueError: Cannot assign "<class 'django.contrib.auth.models.User'>": "Post.author" must be a "User" instance.
Run Code Online (Sandbox Code Playgroud)
模型.py文件
from django.db import models
from django.contrib.auth.models import User
THE_GENDER = [
("Monsieur", "Monsieur"),
("Madame", "Madame")
]
class Post(models.Model):
name = models.CharField(max_length=100)
email = models.CharField(max_length=100)
gender = models.CharField(max_length=8, choices=THE_GENDER)
number = models.CharField(max_length=100)
author = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.name
Run Code Online (Sandbox Code Playgroud) django ×10
python ×6
django-orm ×1
django-views ×1
import ×1
migration ×1
mongodb ×1
python-3.x ×1