2016-08-11 4 views
0

При внесении изменений в класс meta для включения unique_together и попыток makemigrations, я продолжаю получать «Обнаруженные изменения», которые, как я предполагаю, не ожидается. ERROR # 1Django - meta class

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

Фактически я могу заставить миграцию изменить другие аспекты модели, а затем вручную отредактировать файл migration.py, который работает. Однако при использовании модели в tabularinline и переопределении save_formset я получаю «значение Enum с этим кодом Enum уже существует». ERROR # 2

Dirty message: Unique constraint screenshot

Model.py

class EnumValue(models.Model): 
    enum_code = models.CharField(max_length=16, unique=True) 
    enum_value_en = models.CharField(max_length=40, verbose_name='English VALUE') 
    lowercase_enum_value_en = models.CharField(max_length=500, db_index=True) 
    enum = models.ForeignKey(Enum, db_index=True, verbose_name='Enum') 
    created_date = models.DateTimeField(auto_now_add=True) 
    modified_date = models.DateTimeField(auto_now=True) 
    created_by = models.ForeignKey(User, related_name='enumvalue_created_by_user') 
    modified_by = models.ForeignKey(User, related_name='enumvalue_updated_by_user') 

class Meta: 
    unique_together = (('enum_code', 'enum'),) 
    ordering = ('lowercase_enum_value_en',) 

def __unicode__(self): 
    return self.enum_value_en 

class Meta: 
    verbose_name_plural = 'Enum Values' 

Migration.py

class Migration(migrations.Migration): 

dependencies = [ 
    ('dq', '0031_enum_enumvalue'), 
] 

operations = [ 
    migrations.AlterUniqueTogether(
     name='enumvalue', 
     unique_together=set([('enum_code', 'enum')]), 
    ), 
] 

** Админ - tabularinline **

def save_formset(self, request, form, formset, change): 
    if formset.is_valid: # ensures no blank forms are submitted 
     instances = formset.save(commit=False) # gets instance from memory and add to it before saving it 
     for obj in formset.deleted_objects: 
      obj.delete() 
     for instance in instances: 
      instance.modified_by = request.user 
      instance.created_by = request.user 
      instance.lowercase_enum_value_en = instance.enum_value_en.lower() # no need to get clean data from "form" 
      instance.save() 
     formset.save() 

Я использую Django версию 1.8.4

+0

Это может быть вызвано многими вещами, ваш пост слишком широк. Прежде всего, проверьте, какие миграции были сделаны с помощью 'manage.py showmigratons'. Если вы перенесли миграцию в прошлом с тем же именем, что и текущая миграция, база данных будет думать, что она уже сделана. – Siegmeyer

+0

showmigrations не предлагает дублировать имя. Когда я планирую, я ожидал бы, что изменение метакласса будет обнаружено как изменение, и это не является моей основной проблемой. В сущности, я прошу, чтобы изменение метакласса вызвало новую миграцию (ошибка №1), и поскольку я вручную взломал миграцию, это, в свою очередь, вызывает другую ошибку, отмеченную мной как # 2. Большое спасибо. –

ответ

1

Ваш EnumValue класс имеет Meta классы. Это ведет себя так же, как переназначение переменной: определение первого класса теряется, и остается только определение второго класса. Вам нужно объединить их вместе в один класс.

class EnumValue(models.Model): 
    ... 
    class Meta: 
     unique_together = (('enum_code', 'enum'),) 
     ordering = ('lowercase_enum_value_en',) 
     verbose_name_plural = 'Enum Values' 

    def __unicode__(self): 
     return self.enum_value_en 
+0

Спасибо вам, это сработало. –

0

Я думаю, что причина в том, что ваш enum_code поля уже unique=True сам по себе. Таким образом, он автоматически уникален вместе с любым другим полем без миграции, и ваша ошибка также объясняется.

+0

спасибо remo, мой плохой, это был надзор и ошибки, когда он должен был. Однако я не получаю сообщение об ошибке. Например, «Enum с этим значением Enum Value и Enum Id уже существует». Вместо этого я получаю «IntegrityError at/admin/dq/enumvalue/add/ORA-00001: уникальное ограничение (SAP_DS_01.D1301C0ACA6DBFD7B9592F0E5C3391) нарушено ....» –

+0

Создали ли вы миграцию, когда вы удалили уникальный из этого поля и применили Это? Кажется, база данных по-прежнему считает, что поле уникально. – RemcoGerlich

+0

Нет, но теперь существует уникальное ограничение по обоим столбцам, которое я могу нарушить, но проблема в том, что сообщение об ошибке должно быть чистым, т. Е. «Enum с этим значением Enum Value и Enum Id уже существует». Пожалуйста, см. Скриншот, прикрепленный к моему оригинальному сообщению –

Смежные вопросы