Как я могу загрузить светильники с круглыми внешними ключами в Django? - PullRequest
4 голосов
/ 08 ноября 2011

У меня есть модель для категорий, которая содержит круговой внешний ключ.Я сбросил все данные из этой модели и создал миграцию данных с помощью django-south для загрузки их в другую СУБД, но у меня возникли большие проблемы из-за этой круговой зависимости.модель, о которой я говорю:

class Category(MPTTModel):
    name = models.CharField(_('name'), max_length=50, unique=True)
    parent = models.ForeignKey('self', null=True, blank=True, related_name='categories')
    description = models.TextField(_('description'), blank=True, null=True)
    created_on = models.DateTimeField(auto_now_add = True, default=date.today())
    updated_on = models.DateTimeField(auto_now = True, default=date.today())

    def __unicode__(self):
        return "%s" %(self.name)

    class Meta:
        verbose_name = _('category')
        verbose_name_plural= _('categories')

Ответы [ 3 ]

11 голосов
/ 08 ноября 2011

Благодаря этой публикации я смог найти решение. Временное отключение проверок внешнего ключа при загрузке данных является наилучшим возможным решением этой проблемы. Поскольку Django не предоставляет способ сделать это, мы должны выполнить сырой SQL-код. Итак, я создал миграцию данных с помощью django-south, а остальное в коде ниже:

class Migration(DataMigration):

    def forwards(self, orm):
        #~ Disable foreign key checks during fixture loading
        from django.db import connections, DEFAULT_DB_ALIAS
        connection = connections[DEFAULT_DB_ALIAS]
        if 'mysql' in connection.settings_dict['ENGINE']:
            cursor = connection.cursor()
            cursor.execute('SET foreign_key_checks = 0')

        #~ Load fixture
        from django.core.management import call_command
        call_command('loaddata', 'categories_fixture.json', verbosity=0)

        #~ Enable foreign key checks after fixture loading
        if 'mysql' in connection.settings_dict['ENGINE']:
            cursor = connection.cursor()
            cursor.execute('SET foreign_key_checks = 1')
        connection.close()
3 голосов
/ 08 ноября 2011

Быстрый ответ: вам нужно отключить ограничения внешнего ключа при загрузке.

Есть патч для Django, но он может быть или не быть в той версии, которую вы используете:

https://code.djangoproject.com/ticket/3615


В качестве альтернативы, не используйте фикстуры, используйте SQL: https://docs.djangoproject.com/en/dev/howto/initial-data/#providing-initial-sql-data

Положительным моментом является то, что вы можете делать в модельном файле SQL все, что вы можете делать в SQL. Недостатком является то, что он больше не зависит от базы данных, в зависимости от используемого вами SQL.

0 голосов
/ 18 октября 2016

Ответы в 2016 году. Django поддерживает загрузку взаимозависимых приборов, просто добавьте их в один файл

// fixtures.json
[
{
    "model": "A",
    "pk": 1100,
    "fields": {
        "bfk": 1000,
    }
},
{
    "model": "B",
    "pk": 1000,
    "fields": {
        "Afk": 1100
    }
}
]
...