标签: django-migrations

将模型段字段迁移到现有数据库的唯一字段

在旧数据库中,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 django django-models django-migrations

2
推荐指数
1
解决办法
1263
查看次数

Django migrate 不会更新我的数据库

从现有数据库开始,我想更新它的架构。我改变了我的一个模型,然后运行

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 django-migrations

2
推荐指数
1
解决办法
6330
查看次数

Django 迁移地狱,丢了一张桌子。试图取回它

所以我在我的数据库中删除了一个表,我想要它回来。重新运行迁移给出错误表不存在。经过一番狩猎后,我了解到我可以删除 django_migrations 中所有应用名称为我的应用的内容。所以我这样做了,重新迁移它开始工作然后抱怨没有删除的表。

我不知道如何重新找回一张桌子并保持一切原样......无论如何要这样做?

我不在乎数据库中 90% 的数据,只关心几个表和字段。我放下的桌子我不关心数据。

django django-models django-migrations

2
推荐指数
1
解决办法
2385
查看次数

Django:在models.py 中出错并迁移,尝试修复错误但django 在models.py 中没有看到任何更改

所以我在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

2
推荐指数
1
解决办法
3209
查看次数

在迁移回滚期间无法从其他应用程序导入 Django 模型

我正在创建一个数据迁移,并且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在回滚期间有一个使用直接模型的解决方法。不知道会不会给以后带来麻烦。

python django python-3.x django-migrations

2
推荐指数
1
解决办法
225
查看次数

查询django迁移表

如何从视图中查询django_migrations表?例如(我尝试了什么,当然不工作)

from django.db import migrations

latest_migration = migrations.objects.all().order_by('-applied')[0]
Run Code Online (Sandbox Code Playgroud)

如果可能的话,应该如何进行?

django django-views django-migrations

2
推荐指数
1
解决办法
1257
查看次数

在django中迁移模型时如何解决SQLdecode错误?

我是 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)

python django django-models mongodb django-migrations

2
推荐指数
1
解决办法
3831
查看次数

Django 从所有查询中排除字段

我正在 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

2
推荐指数
1
解决办法
7459
查看次数

在自定义迁移中将模型导入为“apps.get_model('app_name', 'ModelName')”的逻辑是什么

我问这个问题是因为当我使用使用MPPT模型的django-hordak时,我遇到了django.db.utils.IntegrityError: null value in column \xe2\x80\x9clft\xe2\x80\x9d违反非空约束

\n\n

提出的一些解决方案虽然hacky违背了惯例,但确实有效。

\n\n

基础

\n\n

在 django 中,当编写自定义迁移时,例如创建基线数据时。

\n\n
def 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 \n
Run Code Online (Sandbox Code Playgroud)\n\n

在我的情况下,django-hordak 具有帐户模型。.objects.create(**data)\nraises the上面指定的数据库上的 IntegrityError 。

\n\n

建议的解决方案

\n\n

建议的解决方案之一是直接导入模型。

\n\n
def 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)

django import django-migrations

2
推荐指数
1
解决办法
1107
查看次数

无法分配“<class 'django.contrib.auth.models.User'>”:“Model.user”必须是“User”实例

创建模型的第一个条目抛出错误

我执行了以下命令来迁移

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)

python migration django django-migrations

2
推荐指数
1
解决办法
1035
查看次数