我目前正在为一个discord 机器人开发一个django 项目。我试图解决的问题是我似乎无法查询我的模型之一的数据。
我不清楚的一条信息,我确信导致此问题的是一系列迁移问题,我试图在单独的应用程序中使用与 InventoryInstance 模型的新关系来更新我的角色模型。
当我启动 django shell_plus 会话时 - 尝试查询角色模型时出现此错误:
位于 inventory.models 中
In [1]: Character.objects.all()
Out[1]: OperationalError: no such column: oblivionalchemy_character.inventory_instance_id
这是我的角色和库存实例模型:
位于 oblivionalchemy.models
class InventoryInstance(models.Model):
character_name = models.ForeignKey('oblivionalchemy.Character', on_delete=models.CASCADE, null=True, related_name="character")
items = models.JSONField(default=dict)
class Character(models.Model):
user = models.ForeignKey('discordbot.DiscordUser', on_delete=models.CASCADE, null=True, related_name="characters")
name = models.CharField(max_length=40)
strength = models.IntegerField(default=10)
endurance = models.IntegerField(default=10)
agility = models.IntegerField(default=10)
speed = models.IntegerField(default=10)
willpower = models.IntegerField(default=10)
intelligence = models.IntegerField(default=10)
personality = models.IntegerField(default=10)
luck = models.IntegerField(default=10)
alchemy = models.IntegerField(default=10)
survival = models.IntegerField(default=10)
blade = models.IntegerField(default=10)
marksman = models.IntegerField(default=10)
inventory_instance = models.OneToOneField('inventory.InventoryInstance', on_delete=models.CASCADE, related_name="character", null=True, blank=True)
在另一个模型上创建“上游”依赖关系后,我似乎无法找到一种方法来与这些数据交互以重新创建记录。理想情况下,我希望工作流程顺利进行
Discord用户模型记录已创建 已创建角色模型记录 已创建 InventoryInstance 模型记录。
在创建 DiscordUser 模型之前,我已经有了现有的角色记录。但我不确定我是否理解如何查询这些数据并在对模型进行更改后“掌握所有数据”。谁能帮我理解这里发生了什么?
这是每个应用程序的初始迁移文件:
遗忘化学
class Migration(migrations.Migration):
initial = True
dependencies = [
('discordbot', '0001_initial'),
('inventory', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='Character',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=40)),
('strength', models.IntegerField(default=10)),
('endurance', models.IntegerField(default=10)),
('agility', models.IntegerField(default=10)),
('speed', models.IntegerField(default=10)),
('willpower', models.IntegerField(default=10)),
('intelligence', models.IntegerField(default=10)),
('personality', models.IntegerField(default=10)),
('luck', models.IntegerField(default=10)),
('alchemy', models.IntegerField(default=10)),
('survival', models.IntegerField(default=10)),
('blade', models.IntegerField(default=10)),
('marksman', models.IntegerField(default=10)),
('inventory_instance', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='character', to='inventory.inventoryinstance')),
('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='characters', to='discordbot.user')),
],
),
]
不和谐机器人
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='User',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('discord_id', models.CharField(blank=True, max_length=100, unique=True)),
],
),
]
库存
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='InventoryInstance',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('items', models.JSONField(default=dict)),
],
),
migrations.CreateModel(
name='InventoryItem',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=40)),
('weight', models.IntegerField(default=0)),
('hitpoints', models.IntegerField(default=100)),
('is_default', models.BooleanField(default=False)),
('effects', models.JSONField(default=inventory.models.default_effects_for_item)),
],
),
]
我发现了这个问题,我试图将 OneToOneField 关系与“下游”模型中的foreignkey字段连接起来,这给我带来了一些问题,我通过简单地在需要该功能的每个模型之间放置 OneToOneField 关系来纠正错误.