标签: django-migrations

为什么 GenericRelation 字段在数据迁移 (Django) 中不起作用

我想进行数据迁移以便在数据库中添加用户阅读帖子。有这样的代码:

def user_read_posts(apps, schema_editor):
    User = apps.get_model("main", "User")
    Post = apps.get_model("main", "Post")
    Comment = apps.get_model("comments", "Comment")

    comments = Comment.objects.all()
    for comment in comments:
        print (comment.content_object.__class__.__name__)
        if isinstance(comment.content_object, Post):
            comment.user.read_posts.add(comment.content_object)

class Migration(migrations.Migration):

    dependencies = [
        ('main', '0039_auto_20160314_0906'),
    ]

    operations = [
        migrations.RunPython(user_read_posts),
    ]
Run Code Online (Sandbox Code Playgroud)

并在 print (comment.content_object.__class__.__name__)django 行中引发错误: AttributeError: 'Comment' object has no attribute 'content_object'

评论型号:

class GuidaComment(GenericRelationModel):

    user = models.ForeignKey(GuidaUser)
    text = models.TextField()
Run Code Online (Sandbox Code Playgroud)

所以我该怎么做?

谢谢。

python django data-migration django-migrations

5
推荐指数
1
解决办法
2356
查看次数

在第二个数据库上运行Python迁移

使用 RunPython 在第二个数据库上运行数据库迁移失败

python3 manage.py migrate --database=app
Run Code Online (Sandbox Code Playgroud)

问题是 apps.get_model 方法采用已经具有最新迁移的默认数据库。

不起作用:

def copy_cpr_cents_to_euros(apps, schema_editor):
    User = apps.get_model('accounting', 'User')
    User.objects.filter(...);
Run Code Online (Sandbox Code Playgroud)

作品:

def copy_cpr_cents_to_euros(apps, schema_editor):
    User = apps.get_model('accounting', 'User')
    User.objects.using('app').filter(...);
Run Code Online (Sandbox Code Playgroud)

有没有办法在迁移中使用给定的数据库,因此在这种情况下“app”无需明确声明它,因为它应该适用于两个数据库?

所以像这样:

User.objects.using(database_name).filter(...)
Run Code Online (Sandbox Code Playgroud)

django django-migrations

5
推荐指数
1
解决办法
473
查看次数

Django - 迁移外键字段类型与当前类型不匹配

我正在使用 MSSQL 数据库,并且在 Django 进入展会之前我已经创建了一些表,因此使用Inspectdb我获得了带有 Meta 选项的模型managed=False。然后我创建了其他与 Django 迁移相关的内容。这些模型是这样的:

class ModelAlreadyCreated(models.Model):
    # This PK field is set as varchar(16)
    id = models.CharField(primary_key=True, db_column='CVE', max_length=16)
    ...other fields

    class Meta:
        managed=False

class DjangoModel(models.Model):
    model_ac_fk = models.ForeignKey(ModelAlreadyCreated)
    ... other fields
Run Code Online (Sandbox Code Playgroud)

当我使用创建迁移文件时,makemigrations我得到:

migrations.CreateModel(
        name='DjangoModel',
        fields=[
            ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
            ('model_ac_fk', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ModelAlreadyCreated')),
            ...
        ],
    ),
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切似乎都正常,但使用migrate命令时会显示此错误:

django.db.utils.OperationalError: (1778, "Column 'CVE' is not the same data 
type as referencing column 'model_ac_fk' in foreign key 'model_ac_fk_fk_CVE'.DB-Lib error …
Run Code Online (Sandbox Code Playgroud)

python sql-server django django-migrations

5
推荐指数
0
解决办法
1059
查看次数

Django 项目中的迁移目录是否应该推送到 git 存储库?

在 Django 项目中,当模型更改时,迁移文件也会更改。如果我将迁移目录添加到 git,这会引起其他人的冲突。如果我不添加它,有时在迁移时会引发服务器错误。怎么解决这个\xef\xbc\x9f

\n

git django django-migrations

5
推荐指数
1
解决办法
1981
查看次数

在迁移中处理 GenericRelation 和 GenricForeignKey

我有带有 GenricForeigKey 和 GenericRelation 字段的模型。

class Datasheet(models.Model):
    package1 = GenericRelation('PackageInstance')
    ...

class PackageInstance(models.Model):
    content_object = GenericForeignKey()
    object_id = models.PositiveIntegerField(null=True)
    content_type = models.ForeignKey(ContentType, null=True, on_delete=models.CASCADE)
    ....

Run Code Online (Sandbox Code Playgroud)

我正在从另一个模型迁移,在迁移中我想创建新实例。

    for ds in Datasheet.objects.all():
        pi = PackageInstance.objects.create(content_object=ds)
Run Code Online (Sandbox Code Playgroud)

然而这失败了

TypeError: DesignInstance() got an unexpected keyword argument 'content_object'
Run Code Online (Sandbox Code Playgroud)

另外,ds.package1.all()也会失败。

AttributeError: 'Datasheet' object has no attribute 'package1'
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

django django-contenttypes django-migrations django-generic-relations

5
推荐指数
1
解决办法
753
查看次数

如何在 Django 中使用 call_command() 在特定数据库上运行迁移?

$ python manage.py migrate app_name --database db_name我只是想知道在运行时调用该函数的正确语法是什么management.call_command()

到目前为止,我有以下内容:

from django.core import management
from django.core.management.commands import migrate

# Migrate the core.contrib.dynamics if needed to the pre-specified database:
management.call_command(migrate.Command(), 'dynamics', '--database {}'.format(DB_NAME))
Run Code Online (Sandbox Code Playgroud)

但是,在调用上述内容时,我在运行时收到以下错误:

Cannot find a migration matching '--database default_node' from app 'dynamics'.
Run Code Online (Sandbox Code Playgroud)

我 99% 确定我可能--错误地调用了参数?谁能指出我正确的方向吗?

动态应用程序的迁移如下:

# Generated by Django 3.0.8 on 2020-07-02 14:28

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='ModelSchema',
            fields=[ …
Run Code Online (Sandbox Code Playgroud)

python django django-migrations django-management-command django-3.0

5
推荐指数
1
解决办法
2922
查看次数

在 django 迁移期间处理数据?

class Material(models.Model):
    name = models.CharField(max_length=50, blank=False)
    short_name = models.CharField(max_length=2, blank=False, unique=False, default='Al')
   
    def __str__(self):
        return self.name

    class Meta:
        db_table = 'material'
Run Code Online (Sandbox Code Playgroud)

我创建了这个模型。假设我添加了一个名为的新字段

status = models.IntergerField(default=1)
Run Code Online (Sandbox Code Playgroud)

之后,如果我运行命令 python manage.py makemigrations,那么 django 将在表中添加一个新的字段状态。假设表中有 3 行,则值如下:

1. Material1, M1, 1
2. Material2, M2,1
3. Material3, M3, 1
Run Code Online (Sandbox Code Playgroud)

通过这次迁移,我还想更改每一行的状态并添加新行,就像

1. Material1, M1, 1
2. Material2, M2,0
3. Material3, M3, 0
4. Material4, M4, 1
Run Code Online (Sandbox Code Playgroud)

有什么方法可以处理 django 中模式迁移过程中的数据操作吗?

python django django-models django-migrations

5
推荐指数
1
解决办法
7285
查看次数

Django 将现有字段更改为外键

我有一个 Django 模型,以前看起来像这样:

class Car(models.Model):
    manufacturer_id = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)

还有另一种模型称为Manufacturerid指。然而,我意识到使用 Django 的内置外键功能会很有用,所以我将模型更改为:

class Car(models.Model):
    manufacturer = models.ForeignKey(Manufacturer)
Run Code Online (Sandbox Code Playgroud)

此更改似乎立即工作正常,查询工作没有错误,但是当我尝试运行迁移时,Django 输出以下内容:

- Remove field manufacturer_id from car
- Add field manufacturer to car
Run Code Online (Sandbox Code Playgroud)

执行此迁移将清除数据库中的所有现有关系,因此我不想这样做。我真的根本不想进行任何迁移,因为查询等Car.objects.get(manufacturer__name="Toyota")工作正常。我想要一个适当的数据库外键约束,但这不是一个高优先级。

所以我的问题是:有没有一种方法可以进行迁移或其他方法,使我可以将现有字段转换为外键?我无法使用,--fake因为我需要在开发、产品和同事的计算机上可靠地工作。

python django python-3.x django-migrations

5
推荐指数
1
解决办法
6291
查看次数

在 Django 中处理生产迁移和开发迁移

在开发 Django 项目时,所有迁移都存储在每个应用程序文件夹中,但是,在生产中我不需要这些迁移,我想保留一个Production数据库和一个Development数据库:

如何在生产和开发环境中处理 Django 迁移?

我问这个问题是因为在开发项目中使用新添加的内容来更新我部署的项目非常困难,我理想的情况是将每组迁移保留在源代码外部的文件夹中,就像数据库一样。

django django-rest-framework django-migrations

5
推荐指数
1
解决办法
1718
查看次数

Django 迁移:django.db.utils.OperationalError:(1824,“无法打开引用的表‘classroom_user’”)

我正在尝试将 Django 应用程序从开发服务器部署到生产服务器,我已经使用 python 3.8.10 设置了 virtualenv,创建了 mysql 数据库,我正在 virtualenv 中运行。我没有收到任何错误python manage.py check,运行时得到“未检测到任何更改” python manage.py makemigrations,但是当我运行``python manage.py migrate``时,我得到以下信息:

要执行的操作:
应用所有迁移:admin、auth、contenttypes、sessions
运行迁移:
应用 contenttypes.0001_initial... OK
应用 admin.0001_initial...Traceback(最近一次调用最后):...

回溯的最后一行:

Django.db.utils.OperationalError:(1824,“无法打开引用的表‘classroom_user’”)

(“classroom”是项目“codex”中应用程序的名称)我最近刚刚在我的开发服务器上重建了该数据库中的所有表,没有出现任何问题。
生产服务器上的数据库为空。models.py 已就位且完整。我已经尝试过使用空的迁移文件夹并删除迁移文件夹。迁移确实创建 django_admin_log、django_content_types、django_migrations,但没有其他表。

我在这方面看到的所有其他帖子都是关于外键约束的,但在我的 models.py 中,所有具有外键的表都是在键所在的表之后指定的。

python mysql django django-migrations

5
推荐指数
1
解决办法
3932
查看次数