2016-08-11 1 views
0

Wenn ich eine Meta-Klasse ändere, um eine unique_together einzufügen und Makemigrationen zu versuchen, bekomme ich "No changes detected", was vermutlich kein erwartetes Verhalten ist. ERROR # 1Django - Metaklasse

Ich habe versucht und die Migration für das jeweilige Modell und makemigration zu entfernen, aber das beinhaltet noch nicht dieses Meta-Klasse-Attribut.

Ich kann eine Migration tatsächlich erzwingen, indem ich andere Aspekte des Modells ändere und dann die migration.py manuell bearbeite, die funktioniert. Wenn ich jedoch das Modell in einer tabellarischen Zeile verwende und das save_formset überschreibe, bekomme ich den "Enum-Wert mit diesem Enum-Code existiert bereits". 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')]), 
    ), 
] 

** Admin - 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() 

Ich verwende Django v1.8.4

+0

Dies kann durch viele Dinge verursacht werden, Ihr Beitrag ist zu breit. Überprüfen Sie zuerst, welche Migrationen mit 'manage.py showmigratons' gemacht wurden. Wenn Sie in der Vergangenheit eine Migration mit demselben Namen wie Ihre aktuelle Migration durchgeführt haben, wird die Datenbank davon ausgehen, dass sie bereits erstellt wurde. – Siegmeyer

+0

showmigrations schlägt keinen doppelten Namen vor. Wenn ich Makemigrationen mache, würde ich erwarten, dass der Metaklassenwechsel als Veränderung erkannt wird, und das ist nicht mein zugrunde liegendes Problem. Im Wesentlichen frage ich, ob eine Änderung an der Metaklasse eine neue Migration auslösen würde (Fehler # 1) und weil ich die Migration manuell gehackt habe, verursacht dies wiederum den anderen Fehler, den ich als # 2 markiert habe. Danke vielmals. –

Antwort

1

Ihre EnumValue Klasse hat zweiMeta Klassen. Dies verhält sich genauso wie das Umhängen einer Variablen: Die erste Klassendefinition geht verloren, und nur die zweite Klassendefinition bleibt bestehen. Sie müssen diese zu einer einzigen Klasse zusammenführen.

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

Vielen Dank, das hat funktioniert. –

0

Ich denke, die Ursache ist, dass Ihr enum_code Feld bereits unique=True selbst hat. Daher ist es automatisch zusammen mit anderen Feldern einzigartig, ohne dass eine Migration erforderlich ist, und Ihr Fehler wird ebenfalls erläutert.

+0

danke remo, mein Schlechter, das war ein Versehen und Fehler wenn es sollte. Allerdings bekomme ich die saubere Fehlermeldung nicht. Zum Beispiel "Enum mit dieser Enum-Wert und Enum-ID existiert bereits". Stattdessen bekomme ich die "IntegrityError unter/admin/dq/enumvalue/add/ORA-00001: eindeutige Einschränkung (SAP_DS_01.D1301C0ACA6DBFD7B9592F0E5C3391) verletzt ...." –

+0

Haben Sie eine Migration erstellt, wenn Sie die eindeutige aus dem Feld entfernt und anwenden es? Scheint, dass die Datenbank immer noch denkt, dass das Feld eindeutig ist. – RemcoGerlich

+0

Nein, aber die eindeutige Einschränkung gilt jetzt für beide Spalten, die ich verletzen kann, aber das Problem ist, dass die Fehlermeldung sauber sein sollte, d. H. "Enum mit diesem Enum-Wert und dieser Enum-ID ist bereits vorhanden". Bitte sehen Sie Screenshot an meinen ursprünglichen Beitrag –

Verwandte Themen