【问题标题】:How to Import This ManyToManyField from JSON?如何从 JSON 导入这个 ManyToManyField?
【发布时间】:2013-09-08 17:12:28
【问题描述】:

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
        },

我在导入组件值时遇到问题。 “组件”值是其他项目的键名,在配方中用于创建新项目。这些是我的模型:

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 上使用了 through 选项,您显然不能使用 add、create 或 assignment 来创建关系。

那么我应该怎么做才能将组件值输入数据库?如果这个问题太宽泛,我道歉?我真的不知道我在做什么!我是编程新手,Python 是我的第一语言。

另外,当我查看数据库中的 items.item 架构时,没有“组件”表。这是为什么? ManyToManyFields 是放在单独的表中还是什么的?

【问题讨论】:

    标签: django json manytomanyfield


    【解决方案1】:

    添加到您使用的多对多项目

    components.add(item)

    for component in items["components"]:
        db_item.components.add(component)
    

    多对多关系使用所谓的查找表, 您已经通过through="Composition" 参数定义了这样一个表。 这意味着 Composision 模型将用作存储这些关系的特殊表。

    如果你不指定一个直通表,django 将自动创建一个透明地使用。

    【讨论】:

      猜你喜欢
      • 2014-09-27
      • 1970-01-01
      • 1970-01-01
      • 2020-03-03
      • 1970-01-01
      • 1970-01-01
      • 2013-05-14
      • 1970-01-01
      • 2016-05-22
      相关资源
      最近更新 更多