2015-02-28 11 views

Antwort

11

haben Sie Ihr Modell wie in der Dokumentation erwähnt?

def combine_names(apps, schema_editor): 
    # We can't import the Person model directly as it may be a newer 
    # version than this migration expects. We use the historical version. 
    Person = apps.get_model("yourappname", "Person") 
    for person in Person.objects.all(): 
     person.name = "%s %s" % (person.first_name, person.last_name) 
     person.save() 

Data-Migration Denn an dieser Stelle Sie nicht Ihr Modell direkt importieren:

from yourappname.models import Person 

aktualisieren

Der interne Django-Code ist in dieser Datei django/db/Migrationen /state.py django.db.migrations.state.ModelState # construct_fields

def construct_fields(self): 
    "Deep-clone the fields using deconstruction" 
    for name, field in self.fields: 
     _, path, args, kwargs = field.deconstruct() 
     field_class = import_string(path) 
     yield name, field_class(*args, **kwargs) 

Es gibt nur Felder, die Klone in einer "fake" Modellinstanz sind:

MyModel.__module__ = '__fake__' 

Github Django

+9

ja. Sie können auf Felder auf einem Modell, aber nicht die Modelle Methoden – user2954587

+0

Methoden haben nicht für mich arbeiten! –

13

Modell Methoden sind in Migrationen nicht zur Verfügung, einschließlich Datenmigrationen.

Es gibt jedoch eine Problemumgehung, die dem Aufrufen von Modellmethoden ziemlich ähnlich sein sollte. Sie können Funktionen innerhalb von Migrationen definieren, die jene Modellmethoden nachahmen, die Sie verwenden möchten.

Wenn Sie diese Methode hatte:

class Order(models.Model): 
    ''' 
    order model def goes here 
    ''' 

    def get_foo_as_bar(self): 
     new_attr = 'bar: %s' % self.foo 
     return new_attr 

Sie können Funktion innerhalb Migration Skript schreiben wie:

def get_foo_as_bar(obj): 
    new_attr = 'bar: %s' % obj.foo 
    return new_attr 


def save_foo_as_bar(apps, schema_editor): 
    old_model = apps.get_model("order", "Order") 

    for obj in old_model.objects.all(): 
     obj.new_bar_field = get_foo_as_bar(obj) 
     obj.save() 

es dann in Migrationen verwenden:

class Migration(migrations.Migration): 

    dependencies = [ 
     ('order', '0001_initial'), 
    ] 

    operations = [ 
     migrations.RunPython(save_foo_as_bar) 
    ] 

Auf diese Weise Migrationen werden Arbeit. Es wird ein bisschen Codewiederholung geben, aber das ist nicht wichtig, da Datenmigrationen eine einmalige Operation in einem bestimmten Zustand einer Anwendung sein sollen.

Verwandte Themen