Ошибка миграции Django South с уникальным полем в базе данных postgresql

Редактировать: я понимаю, почему это произошло. Это было из-за существования файла `initial_data.json`. Судя по всему, юг хочет добавить эти фикстуры после миграции, но не может из-за уникального свойства поля.

Я изменил свою модель с этого:

class Setting(models.Model):
    anahtar = models.CharField(max_length=20,unique=True)
    deger = models.CharField(max_length=40)

    def __unicode__(self):
        return self.anahtar

К этому,

class Setting(models.Model):
    anahtar = models.CharField(max_length=20,unique=True)
    deger = models.CharField(max_length=100)

    def __unicode__(self):
        return self.anahtar

Команда миграции схемы выполнена успешно, но при попытке выполнить миграцию возникает следующая ошибка:

IntegrityError: повторяющееся значение ключа нарушает уникальное ограничение «blog_setting_anahtar_key». ПОДРОБНЕЕ: ключ (anahtar)=(blog_baslik) уже существует.

Я хочу сохранить это поле уникальным, но все же перенести его. Кстати, потеря данных в этой таблице допустима, пока другие таблицы в БД остаются нетронутыми.


person yasar    schedule 13.08.2011    source источник


Ответы (1)


На самом деле поведение syncdb по умолчанию — запускать initial_data.json каждый раз. Из документов Джанго:

Если вы создадите фикстуру с именем initial_data.[xml/yaml/json], эта фикстура будет загружаться при каждом запуске syncdb. Это крайне удобно, но будьте осторожны: помните, что данные будут обновляться каждый раз, когда вы запускаете syncdb. Поэтому не используйте initial_data для данных, которые вы хотите отредактировать.

См.: документы

Лично я считаю, что вариант использования исходных данных, которые необходимо перезагружать каждый раз, когда происходит изменение, запаздывает, поэтому я никогда не использую initial_data.json.

Лучший метод, поскольку вы используете South, — вручную вызвать loaddata для определенного устройства, необходимого для миграции. В случае с начальными данными, это войдет в вашу миграцию 0001_initial.py.

def forwards(self, orm):
    from django.core.management import call_command
    call_command("loaddata", "my_fixture.json")

См.: http://south.aeracode.org/docs/fixtures.html.

Также помните, что путь к вашему прибору указан относительно корня проекта. Итак, если ваше приспособление находится в «myproject/myapp/fixtures/my_fixture.json», call_command на самом деле будет выглядеть так:

call_command('loaddata', 'myapp/fixtures/my_fixture.json')

И, конечно же, ваше приспособление не может называться «initial_data.json», в противном случае вступит в действие поведение по умолчанию.

person Chris Pratt    schedule 13.08.2011