JSON文件的结构如下:
"quarterstaff": {
"id": 10,
"img": "quarterstaff_lg.png",
"dname": "Quarterstaff",
"components": null,
"created": false
},
"oblivion_staff": {
"id": 67,
"img": "oblivion_staff_lg.png",
"dname": "Oblivion Staff",
"components": [
"quarterstaff",
"sobi_mask",
"robe"
],
"created": true
},
我在导入组件值时遇到问题。 “components”值是其他项的键名,用于创建新项的配方。这些是我的模特:
class Item(models.Model):
unique_id = models.IntegerField(unique=True)
itemkey = models.CharField(max_length=255)
dname = models.CharField(max_length=255)
img = models.CharField(max_length=255)
components = models.ManyToManyField('self', blank=True, symmetrical=False, through='Composition')
class Composition(models.Model):
whole = models.ForeignKey(Item, related_name = 'as_a_whole')
component = models.ForeignKey(Item, related_name = 'as_a_part')
我使用命令文件从JSON文件导入数据。
def update_item(self, key, item):
try:
db_item = Item.objects.get(unique_id=item['id'])
print 'Updating %s..' % item['dname']
except Item.DoesNotExist:
print 'Creating %s..' % item['dname']
db_item = Item()
db_item.unique_id = item['id']
db_item.itemkey = key
db_item.dname = item['dname']
db_item.img = item['img']
db_item.components = item['components']
db_item.save()
def fetch_items(self, result):
try:
for key, item in result['itemdata'].items():
self.update_item(key, item)
我收到了这个错误:AttributeError: Cannot set values on a ManyToManyField which specifies an intermediary model. Use items.Composition's Manager instead.
我认为这是因为db_item.save()
,因为我在ManyToManyField上使用了一个通过选项,你显然无法使用添加,创建或赋值创造关系。
那么我应该怎么做才能将组件值放入数据库?如果这个问题过于宽泛,我道歉?我真的不知道我在做什么!我是编程新手,Python是我的第一语言。
此外,当我查看数据库中的items.item架构时,没有“组件”表。这是为什么? ManyToManyFields是放在单独的表中还是什么?
答案 0 :(得分:0)
要添加多对多项目,请使用
components.add(item)
即
for component in items["components"]:
db_item.components.add(component)
许多关系使用所谓的查找表,
您已通过through="Composition"
参数定义了此类表。
这意味着Composision模型将用作存储这些关系的特殊表。
如果你没有指定一个直通表,那么django会自动创建一个透明表。