2015-10-07 4 views
5

Ich bin nur eine einfache Befehl python manage.py makemigrationsSie versuchen, eine nicht-Nullable-Feld ‚id‘ hinzuzufügen, ohne eine Standard contact_info

jedoch mit, alles, was ich bekommen, ist dieser Fehler:

You are trying to add a non-nullable field 'id' to contact_info without a default; 
we can't do that (the database needs something to populate existing rows). Please select a fix: 
1) Provide a one-off default now (will be set on all existing rows) 
2) Quit, and let me add a default in models.py 

Hier ist models.py:

class Document(models.Model): 
    docfile = models.FileField(upload_to='documents/') 


class contact_number(models.Model): 
    contact_numbers= models.CharField(max_length=13) 

class contact_address(models.Model): 
    address = models.CharField(max_length=100) 
    city = models.CharField(max_length=50) 
    state = models.CharField(max_length=50) 
    zip = models.CharField(max_length=5) 

class contact_info(models.Model): 
    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=50) 
    email = models.EmailField() 
    contact_numbers=models.ManyToManyField(contact_number) 
    addresses=models.ManyToManyField(contact_address) 
+0

Haben Sie den Fehler gelesen? Es ist sehr spezifisch. Was ist damit verwirrt? –

+0

es ist spezifisch, aber ich weiß nicht, wie man das korrigiert oder Werte in db setzt. – shashank

+3

Hatten Sie zuvor ein anderes Feld als Primärschlüssel festgelegt? Ich bin überrascht, dass die Migration versucht, ein ID-Feld hinzuzufügen. – Alasdair

Antwort

3

können Sie `default =" "und auch editierbar = False setzen.

Zum Beispiel first_name = models.CharField(max_length=50, default="", editable=False).

Das Hinzufügen eines ID-Feldes ist nicht erforderlich. Django fügt es automatisch hinzu.

Bearbeiten: Löschen der letzten Migrationsdateien in Ihrem Migrationsordner und erneutem Versuch. Wenn es nicht funktioniert, wiederholen Sie den gleichen Vorgang, Sie werden wissen, dass Sie die richtige Datei gelöscht haben, wenn Ihr "makemigrations" -Befehl funktioniert.

+0

Ich habe das ID-Feld nicht hinzugefügt Ich möchte dieses Modell in die Datenbank migrieren, aber es zeigt diese Nachricht an, von der ich nicht weiß, wie ich das durchmachen soll – shashank

+0

Haben Sie den syncdb-Befehl zuerst ausgeführt, führen Sie python manage.py makemigrations aus yourapp nach dem Ausführen von Python manage.py syncdb – pycod333

+0

yup, es zeigt: Keine Migrationen zutreffen. Ihre Modelle haben Änderungen, die sich noch nicht in einer Migration widerspiegeln, und werden daher nicht angewendet. Führen Sie "manage.py makemigrations" aus, um neue Migrationen durchzuführen, und führen Sie dann "manage.py migrate" erneut aus, um sie anzuwenden. – shashank

0

Dies geschieht, weil Sie nicht leere Datenbank. Es muss eine Zeile geben, die nicht über Django ORM erstellt wurde.

Sie wie folgt: Python manage.py

from <path_to_your_models> import * 
print len(list(contact_info.objects.filter(id = None))) 

diese Weise können Sie herausfinden, Shell, wie viele solcher Reihen gibt. Wenn Sie sie beibehalten möchten, erstellen Sie einfach ein Migrationsskript mit einem Wert, den Sie ihm geben.

+0

ich Shell verwendet und versuchen, die Werte hinzuzufügen, aber es zeigt: >>> p1 = contact_number (contact_numbers = '12345678') >>> p1.save() IntegrityError: myapp_contact_number.contact_id_id kann nicht NULL sein Wie kann ich django Standard-ID oder den Zugang myapp_contact_number.contact_id_id Romove – shashank

1

Sie müssen einen Standardwert festlegen. Zum Beispiel:

field_eg = models.CharField(default="") 

bedeutet:

name = models.CharField(max_length=100, default="") 
+0

danke, ich werde versuchen, dies – shashank

14

Dies geschieht, wenn ein anderes Feld als Primärschlüssel mit primary_key=True zuvor markiert wurde und Sie entfernen, dass (bei denen django einem id primären hinzuzufügen versucht Schlüssel).

Dass Django nach einem Standardwert für einen Primärschlüssel fragt, scheint ein Fehler zu sein.

, um dieses Problem zu umgehen, gehen Sie folgendermaßen vor:

1) einen zufälligen Standardwert liefern, wenn während makemigrations aufgefordert.

2) Gehen Sie auf die Migrationsdatei erzeugt (unter your_app\migrations\ und löschen Sie die default=x,, x der Zufallswert in Schritt geliefert wird 1

3) Während Sie an der Migrationsdatei sind, die Reihenfolge der Maßnahmen sicherstellen, Sinn machen (z. B. Entfernen/Ändern eines Primärschlüssels vor dem Hinzufügen eines anderen). Speichern und schließen.

4) Wie üblich migrieren.

+3

Ja, das ist das Problem und die Lösung, es ist in der Tat ein Fehler scheint es, die bewährte Lösung ist nicht richtig. – Brambor

+0

@ mehmet Großartig! Diese Problemumgehung half mir, nach vielen anderen Dingen endlich weiterzumachen. Es scheint, dass dies der Bug ist (https://code.djangoproject.com/ticket/22997). Aber leider wurde ein weiterer Fehler (https://code.djangoproject.com/ticket/24030#comment:9) nach dem oben genannten entdeckt. Ich musste die Datenbank vollständig löschen und alle Migrationen erneut ausführen, um das Standardfeld "ID" als Primärschlüssel verwenden zu können. – Anupam

0

Ich stieß auf ähnliches Problem bei der Makemigration. Ich hatte einen Primärschlüssel mit dem Namen 'Identität' und andere Felder in meinen Modellen, auf die ich Makemigrationen anwendete. Später änderte ich den Namen des Primärschlüssels in '_id' und bekam diesen Fehler.

You are trying to add a non-nullable field '_id' to swapidentity without a default; we can't do that (the database needs something to populate existing rows).

Fehler ist etwas irreführend, aber wenn Sie ‚_id‘ auf ‚Identität‘ ändern zurück Sie nicht, dass Fehler.

Wie zu beheben? Löschen des unter dem Migrationspaket erstellten Migrationsskripts. Oder ändern Sie den Primärschlüssel in Ihrem generierten Migrationsskript manuell.

Verwandte Themen