2016-04-17 10 views
1

Ich muss ForeignKey Feld zu Modell hinzufügen, aber makemigrations gibt Fehler zurück, um Standard festzulegen. Aber ich werde keinen Standardwert angeben.Django hinzufügen nicht Nullable-Feld (ForeignKey)

Zum Beispiel

@python_2_unicode_compatible 
class Doctor(models.Model): 
    name = models.CharField(max_length=250) 
    surname = models.CharField(max_length=250) 
    middlename = models.CharField(max_length=250) 
    city = models.CharField(max_length=250) 
    specialization = models.ForeignKey('Specialization', blank=True) 

    def __str__(self): 
     return "%s %s" % (self.name, self.surname) 

@python_2_unicode_compatible 
class Specialization(models.Model): 
    name = models.CharField(max_length=250) 
    #spec_table_name = models.ForeignKey('SpecializationTable') 

    def __str__(self): 
     return self.name 

class Consultation(models.Model): 
    client_id = models.ForeignKey('Client') 
    doctor_id = models.ForeignKey('Doctor') 

    #how to dropdown from doctor 
    #record_id = models.ForeignKey(Specialization) 

@python_2_unicode_compatible 
class SpecializationTable(models.Model): 
    name = models.CharField(max_length=250) 

    def __str__(self): 
     return self.name 

class SpecializationTableRow(models.Model): 
    row_name = models.CharField(max_length=250) 
    row_description = models.CharField(max_length=999) 
    row_required = models.BooleanField() 
    table_name = models.ForeignKey(SpecializationTable) 

, dass das Modell, das ich schon, wenn ich versuche, ForeignKey in Specialization Kommentar- - Fehler Appers. Wenn ich alle Migrationen lösche und von vorne anfange, würde kein Fehler auftreten.

Und außerdem - ich habe keine Aufzeichnungen (sauber db).

Wie diesen Fehler übergeben, und drop \ create db nicht von Grund auf neu erstellen?

+0

spezifizieren Sie 'blank = True' zu ​​diesem Feld. –

+0

@MuhammadShoaib aber jeder sagte, dass 'Null' Feld in Db - movetone. Wenn ich Felder weiter hinzufügen muss - sollte eine Menge von "null" sein. Gibt es einen anderen Weg? – kAldown

Antwort

0

Das Problem von Django Sicht ist, dass es wissen muss, was mit bestehenden Aufzeichnungen des Modells Specialization zu tun. Es kann nicht wissen, dass es keine davon gibt.

Wenn Sie eine saubere Datenbank haben, wie Sie sagen, können Sie die Migrationen auf den Punkt aufheben, an dem das betreffende Modell erstellt wurde. Nehmen wir an, Specialization in einer Migration 0003_* genannt erstellt wird, können Sie anrufen:

> python manage.py migrate <app_name> 0002 

Dann können Sie alle Migrationsdateien in der App löschen von 0003 starten. Dann wird makemigrations wieder funktionieren. Wenn es es in 0001 erstellt wird, müssen Sie tun:

> python manage.py migrate <app_name> zero 

Nachdem dies gesagt ist, ist der Standardwert, den Sie während makemigrations liefern wird nicht in irgendeiner Weise erhalten (es wird nur für bestehende Datensätze während migrate angewendet werden). Wenn Sie also eine leere Datenbank haben, hat die Angabe eines beliebigen Werts (z. B. 1) keinerlei Auswirkungen.

+0

Ich habe fast den gleichen Weg gemacht, außer dass ich nichts über 'Zero' wusste, also danke. Aber stell dir vor, ich arbeite an der Produktion, kann ich diesen Trick machen? Ich denke nein, Felder mit "Null" -Wert zu ändern, auch schlechte Prop. Ich verstehe vollkommen, dass dies mein Fehler ist, nicht gut über Architektur nachzudenken, aber hey, warum gibt es keine Lösung mit geringen Schmerzen? – kAldown

+0

Hier kann es keine Schmerzen geben. Stellen Sie sich vor, dass Sie in der Produktion, wenn Sie bereits Datensätze haben und ein Feld hinzufügen, das keine Nullwerte sein kann, irgendwann entscheiden müssen, welchen Wert Sie diesen Datensätzen geben wollen ... – schwobaseggl

Verwandte Themen