2016-06-14 7 views
-1

vor allem Entschuldigung für mein schlechtes Englisch.Wie man ein bestehendes Modell auf Django in zwei oder mehr teilen

Ich habe ein Problem, ich bekomme eine Django-App, um einige Änderungen vorzunehmen und eines der Dinge, die ich tun muss, ist die Modelle zu teilen. Weil einige der Modelle in der App zuooooo groß sind. Aber ich kann die Datenbank und die Informationen nicht verlieren, weil einige der Modelle mehr als 2000 Objekte haben.

Ich denke, ich werde einige Querys in SQL tun müssen, aber vielleicht kann mir jemand eine Hand geben oder Ideen, wie es geht.

Dies ist das Beispiel dafür, was ich brauche

Beispiel des ursprünglichen Modells

class order(models.Model): 
     client = models.ForeignKey(Client) 
     brand = models.CharField(max_length=50) 
     dispositive = models.CharField(max_length=100) 
     serial = models.CharField(max_length=100) 
     work = models.CharField(max_length=50) 
     detail = models.TextField() 
     price = models.IntegerField(default=0) 
     deposit = models.IntegerField(default=0) 
     created_date = models.DateTimeField(
       default=timezone.now) 

Nun, ich das Modell aufgespalten müssen auf dieser

class Order(models.Model): 
     client = models.ForeignKey(Client) 
     created_date = models.DateTimeField(
       default=timezone.now) 
     published_date = models.DateTimeField(
       blank=True, null=True) 


class OrderDetail(models.Model): 
     order = models.ForeignKey(Order) 
     work = models.CharField(max_length=50) 
     detail = models.TextField() 
     price = models.IntegerField(default=0) 
     deposit = models.IntegerField(default=0) 


class OrderDispositive(models.Model): 
     order = models.ForeignKey(Order) 
     brand = models.CharField(max_length=50) 
     dispositive = models.CharField(max_length=100) 
     serial = models.CharField(max_length=100) 

Nun, ich habe wirklich keine Ahnung darüber, wie man das macht, ohne irgendwelche der vorhandenen Daten in der Datenbank zu verlieren!

ich weiß, dass ich dies nach tun, um zu ändern habe, die Ansichten und die Vorlagen die korrekten Daten zu erhalten, aber ich brauche wirklich einige Modelle für zukünftige Änderungen

Vielen Dank für Ihre Hilfe zu beheben !!!

+1

Warum müssen Sie das Modell an erster Stelle teilen? Ist in Ihrem neuen System mehr als ein OrderDetail-Datensatz für jede Bestellung zulässig? – e4c5

+0

Das in der Frage vorgestellte Modell ist ein Beispiel. Ein Freund möchte einen Teil der App implementieren, der die großen Modelle hat, aber in der neuen App, die wir machen, haben wir eine andere db-Struktur, aber wir können die Strukturen vereinheitlichen, wenn wir das schaffen könnten! – marcosgue

+0

Wie kann Ihnen jemand eine gute Antwort geben, wenn Sie keine genauen Informationen zur Verfügung stellen? – e4c5

Antwort

3

Sie können dies tun, indem Sie Ihre own migrations schreiben.

Schritt1: Erstellen Sie neue Modelle, ohne Originalmodelle zu löschen.

Schritt2: Führen Sie dann Makemigrationen aus.

Vor der Migration ändern Sie Ihre Migrationsdatei, um Daten in andere Tabellen zu kopieren.

your_new_migrations.py

def update_Orderdata(apps, schema_editor): 
    old_order = apps.get_model("some_app", "order") 

    for instance in old_order.objects.all(): 
     # copy data to new order 

def update_OrderDetail(apps, schema_editor): 
    # copy data new tables OrderDetail 

def update_OrderDispositive(apps, schema_editor): 
    # copy data to new table OrderDispositive 

class Migration(migrations.Migration): 

    dependencies = [ 
     # ... your existing dependencies 
    ] 

    operations = [ 


     # original migration, such: 
     # new Order table table, 
     # new OrderDetail table 
     # new OrderDispositive table 

     # add this operation at last... 

     migrations.RunPython(update_Orderdata, reverse_code=migrations.RunPython.noop), 
     migrations.RunPython(update_OrderDetail, reverse_code=migrations.RunPython.noop), 
     migrations.RunPython(update_OrderDispositive, reverse_code=migrations.RunPython.noop), 

    ] 

Dann

python manage.py migrate app_name 

Schritt 3: Nun Urmodelle entfernen (Klasse Reihenfolge). und laufen makemigration &

python manage.py makemigrations app_name 
python manage.py migreate app_name 

Hinweis migrieren: Vor obigen Lösung nehmen Backup Ihrer Datenbank zu versuchen.

+0

Danke !!! Ich werde es versuchen und zurückkommen, um dir zu sagen, wie es funktioniert !! – marcosgue

Verwandte Themen