Как импортировать это ManyToManyField из JSON?

Файл 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, для которой вы, очевидно, не можете использовать добавление, создание или назначение для создания отношений.

Итак, что я должен делать, чтобы получить значения компонентов в базу данных? Я прошу прощения, если этот вопрос слишком широк? Я действительно не знаю, что я делаю! Я совершенно новичок в программировании, Python - мой первый язык.

Кроме того, когда я смотрю на схему items.item в базе данных, нет таблицы для "компонентов". Это почему? Размещены ли ManyToManyFields в отдельных таблицах или как?

1 ответ

Чтобы добавить к элементам многие ко многим, которые вы используете

components.add(item)

т.е.

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

Во многих отношениях многие используют так называемую таблицу поиска, такую ​​таблицу вы определили с помощью through="Composition" параметр. Это означает, что модель Composision будет использоваться в качестве специальной таблицы для хранения этих отношений.

если вы не укажете сквозную таблицу, django автоматически создаст ее для прозрачного использования.

Другие вопросы по тегам