由于未知原因,我无法将Item_rarity
表的外键实例分配到Detailed_item
表中。 Django抛出一个错误:
无法指定" u' Basic'":" Detailed_item.rarity"必须是" Item_rarity"实例。的
...但是在Item_rarity
词典"基本"记录存在 - 我可以从管理面板中选择它并手动创建Detailed_item
记录。
我已经定义了模型:
class Detailed_item(models.Model):
item_id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=50)
level = models.IntegerField()
icon = models.CharField(max_length=150)
rarity = models.ForeignKey('Item_rarity')
general_type = models.ForeignKey('Item_type')
detailed_type = models.ForeignKey('Item_detailed_type')
class Item_rarity(models.Model):
name = models.CharField(max_length=15, primary_key=True)
class Item_type(models.Model):
name = models.CharField(max_length=15, primary_key=True)
class Item_detailed_type(models.Model):
name = models.CharField(max_length=20, primary_key=True)
在视图中,我尝试以这种方式填充它(插入多个项目):
...
items = get_all_items() #get dict of items
for element in items:
tmp_det_type = ''
for key, val in element.iteritems():
#get 'detailed type' from inner dict
if key == "type":
tmp_det_type = val
item = Detailed_item(
item_id=element['id'],
name=element['name'],
level=element['level'],
icon=element['icon'],
rarity=element['rarity'], #error
general_type=element['type'],
detailed_type=tmp_det_type,
)
item.save()
...
我甚至尝试过硬编码" Basic"字符串,但它也不起作用。
*已解决*
接下来的两个条目Item_type
和Item_detailed_type
也无效。
正确的代码:
from app.models import Detailed_item, Item_rarity, Item_type, Item_detailed_type
...
items = get_all_items() #get dict of items
for element in items:
tmp_det_type = ''
for key, val in element.iteritems():
#get 'detailed type' from inner dict
if key == "type":
tmp_det_type = val
#create objects with string values
obj_rarity = Item_rarity(name=element['rarity'])
obj_item_type = Item_type(name=element['type'])
obj_item_detailed_type = Item_detailed_type(name=tmp_det_type)
item = Detailed_item(
item_id=element['id'],
name=element['name'],
level=element['level'],
icon=element['icon'],
rarity=obj_rarity,
general_type=obj_item_type,
detailed_type=obj_item_detailed_type,
)
item.save()
...
答案 0 :(得分:8)
Item_rarity
对象时应传递 Detailed_item
实例,因为Item_rarity是Detailed_item中的外键相关对象。
您可能已经传递了Basic
字符串而不是<Basic Object>
本身。
在使用ORM在django中创建对象时,任何与foreign_key相关的对象都应该提供实例本身而不是对象的id(pk),而从数据库中获取数据时,您可以使用任一实例或实例的id(pk)。
class ParentModel(models.Model):
model_field = models.CharField(max_length=16)
class MyModel(models.Model):
some_field = models.ForeignKey('ParentModel')
parent_model = ParentModel.objects.create(model_field='some_data')
my_model = MyModel.objects.create(some_field=parent_model)
^^^^^^^^^^^^
请注意,传递parent_model对象本身而不是id
取回数据时,
parent_model = ParentModel.objects.get(model_field='some_data')
my_model = MyModel.objects.get(some_field=parent_model)
or
my_model = MyModel.objects.get(some_field=parent_model.id)
两者都适用于数据提取。
答案 1 :(得分:0)
如果将kwarg更改为rarity_name
,则不必在创建时提供相关对象:
item = Detailed_item(
item_id=element['id'],
name=element['name'],
level=element['level'],
icon=element['icon'],
rarity_name=element['rarity'], # no error
general_type=element['type'],
detailed_type=tmp_det_type,
)
我只使用常规id
字段(自动pk)对其进行了测试
应该使用你的主键就好了。
E.g。
class SimpleModel(Model):
value = TextField(blank=True)
class ComplexModel(Model):
simple = ForeingKey(SimpleModel)
title = TextField(unique=True)
ComplexModel.objects.create(title='test', simple_id=1)