2017-06-20 2 views
0

Ich habe ein Szenario, in dem ich die Daten von einem Modell (altes Modell, wo einige Daten bereits vorhanden sind) zu einem anderen Modell und wiederum zu einem anderen Modell wenn notwendig verschieben kann Ich füge diesen Prozess in der Migrationsdatei so hinzu, dass ich die Anforderung mit nur python manage.py migrate Befehl erreichen kann.Wie kann ich Migrationen verwenden, um Daten zu verschieben?

das ist das Modell, in dem alle alten Elemente vorhanden sind:

class UserFavorite(CreatedAtMixin): 
    user = models.ForeignKey('auth.User') 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey('content_type', 'object_id') 

objects = UserFavoriteManager() 

def __str__(self): 
    try: 
     return str(self.content_object) 
    except AttributeError: 
     return 'None' 

class Meta: 
    get_latest_by = "date_added" 
    unique_together = ("user", "content_type", "object_id")` 

Hier ist das Modell, wo ich brauche Element eingefügt werden zunächst pro Artikel in oben Modell:

class CollectionItem(models.Model): 

sort_number=models.PositiveIntegerField(blank=True,null=True) 
type=models.CharField(max_length=20,null=False, blank=False) 
item_type = models.ForeignKey(ContentType, limit_choices_to=models.Q(app_label='news', model='News') | models.Q(app_label='work', model='Work') | models.Q(app_label='collection', model='Quote')) 
item_id = models.PositiveIntegerField() 
item = generic.GenericForeignKey('item_type', 'item_id') 

class Meta: 
    verbose_name = "Collection Item" 
    verbose_name_plural = "Collection Items" 
def __str__(self): 
    return self.item.title 

dann brauche ich Einfügen in:

class Collections(CreatedAtMixin): 
user = models.ForeignKey('auth.User', related_name='collections_user') 
collection_place=models.ForeignKey('companies.CompanyOffice',related_name='collections_place',null=True) 
collection_name = models.CharField(max_length=40,null=False, blank=False) 
description = models.TextField(null=True, blank=True) 
items=models.ManyToManyField('collection.CollectionItem') 
def __str__(self): 
    return self.collection_name 

class Meta: 
    unique_together = ("user","collection_name") 
    verbose_name = "Collection" 
    verbose_name_plural = "Collections" 
    ordering = [ '-created_at'] 
    get_latest_by = "created_at" 

Antwort

1

Schreiben Sie zuerst Ihre neuen Modelle und create a schema migration.

Dann und schreiben Sie den erforderlichen Code, um Ihre alten Modelle Daten zu den neuen Modellen zu übertragen (Hinweis: Wenn möglich, schreiben Sie auch den Code, um Ihre Migration zurück zu setzen).

Schließlich - unter der Annahme, dass die alten Modelle nicht mehr verwendet werden - entfernen Sie den alten Modellcode und erstellen Sie eine letzte Schemamigration.

Die Details sind alle in den obigen Links dokumentiert, und was übrig ist, ist spezifisch für Ihre Anwendung, so dass wir nicht weiter helfen können.

Verwandte Themen