gpt4 book ai didi

python - Django 数据迁移引发类型错误

转载 作者:行者123 更新时间:2023-11-28 16:33:21 25 4
gpt4 key购买 nike

我有两个相关模型; ItemCategory ,并且我正在尝试编写数据迁移以将现有项目放入类别中。到目前为止,迁移看起来像这样:

def categorise(apps, schema_editor):
Category = apps.get_model("orders", "Category")
Item = apps.get_model("orders", "Item")
some_category = Category.objects.create(name="Category name")
some_category.items.add(Item.objects.get(name="Item name"))


class Migration(migrations.Migration):

dependencies = [
('orders', '0005_populate'),
]

operations = [
migrations.RunPython(categorise)
]

模型(的相关部分)看起来像这样:

class Item(models.Model):
name = models.CharField(max_length=200)

class Category(models.Model):
name = models.CharField(max_length=200)
items = models.ManyToManyField(Item)

但是,当我执行上面列出的迁移时,我在 categorise 的最后一行遇到了类型错误。功能。它告诉我TypeError: 'Item' instance expected, got <Item: Item object> .这很奇怪,因为它们看起来是同一类型。我注意导入了 Item通过应用程序而不是通过常规进行建模 import为了确保它与创建当前数据库中的项目的历史模型定义相同。

可能是什么原因?

编辑:这是之前迁移的相关部分。我现在意识到其中一些是在我更新到 Django 1.8 之前产生的。这相关吗?

编辑 2:结果是,运行 python manage.py migrate直接连续两次确实解决了这个问题。这是什么意思?

更新:这原来是 1.8 中的一个错误,但将在 ticket 24573 的补丁中修复。合并。

0001:

class Migration(migrations.Migration):

dependencies = [
]

operations = [
migrations.CreateModel(
name='Item',
fields=[
('id', models.AutoField(serialize=False, verbose_name='ID', auto_created=True, primary_key=True)),
('name', models.CharField(max_length=200))
],
options={
},
bases=(models.Model,),
),
]

0002:

class Migration(migrations.Migration):

dependencies = [
('orders', '0001_initial'),
]

operations = [
migrations.CreateModel(
name='Category',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=200)),
('items', models.ManyToManyField(to='orders.Item'))
],
options={
},
bases=(models.Model,),
),
]

0003:

class Migration(migrations.Migration):

dependencies = [
('orders', '0002_category'),
]

operations = [
migrations.AlterField(
model_name='item',
name='discounts',
field=models.ManyToManyField(blank=True, to='orders.Discount'),
preserve_default=True,
),
]

0005:

def populate(apps, schema_editor):
Item = apps.get_model("orders", "Item")

def add_item(name):
item = Item.objects.create(name=name)
# ..

add_item("Item name", 160)
# .. etc

class Migration(migrations.Migration):

dependencies = [
('orders', '0004_auto_20150328_0929'),
]

operations = [
migrations.RunPython(populate)
]

最佳答案

我猜您使用的是 1.7。并且 apps 中的模型在上一次迁移的更改影响其中一个模型后未正确重新加载。在 1.8 中对此的处理更好。

解决方法是直接使用添加Item的主键:

def categorise(apps, schema_editor):
Category = apps.get_model("orders", "Category")
Item = apps.get_model("orders", "Item")
some_category = Category.objects.create(name="Category name")
some_category.items.add(Item.objects.get(name="Item name").pk)
# or for multiple items
some_category.items.add(Item.objects.filter(...).values_list('pk', flat=True))

关于python - Django 数据迁移引发类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29579871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com