Ich erstelle eine Datenmigration mit der Methode RunPython
. Wenn ich jedoch versuche, eine Methode für das Objekt auszuführen, werden keine definiert. Ist es möglich, eine in einem Modell definierte Methode mit RunPython
aufzurufen?Django-Migrationen RunPython kann keine Modellmethoden aufrufen
Antwort
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__'
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.
- 1. Testen von Django und Modellmethoden
- 2. UIAlertView kann keine Delegierungsmethoden aufrufen - Bereitstellungsziel iOS7
- 3. übergeben Array als Parameter des RunPython-Skript in VBA (xlwings)
- 4. Python/Django: Hinzufügen von benutzerdefinierten Modellmethoden?
- 5. Übergabe von Argumenten an Modellmethoden in Django-Vorlagen
- 6. NSURLSession: kann nach dem Aufrufen von cancelByProducingResumeData keine Fortsetzungsdaten erhalten
- 7. Warum kann ich auf diese Weise keine überladene Funktion aufrufen?
- 8. Ich kann keine Funktion innerhalb einer if-Anweisung aufrufen
- 9. VB-Skript kann keine Website aufrufen: Fehler 404 bekommen
- 10. Kann FindChild (QObject, 'Kind') auf QObject nicht aufrufen. Keine zurück
- 11. Kann strftime nicht auf numpy.datetime64 aufrufen, keine Definition
- 12. Verwenden einer Django-Eigenschaft für benutzerdefinierte Modellmethoden in order_by()
- 13. DropDownListFor wird keine Funktion aufrufen, wenn geändert
- 14. Warum kann ich keine Funktion in der Klasse A aufrufen, aber ich kann sie in der B-Klasse aufrufen
- 15. Kann spsolve nicht aufrufen
- 16. Kann 'saveInBackgroundWithBlock' nicht aufrufen
- 17. Kann Funktion zweimal aufrufen?
- 18. Button will keine Methode aufrufen (ASP.NET - C#)
- 19. CQRS - kann EventListener Befehl aufrufen?
- 20. Wie kann ich Pufferüberlauf aufrufen?
- 21. kann ssh2_connect() Callbacks nicht aufrufen
- 22. Kann `connect` nicht korrekt aufrufen
- 23. Kann benutzerdefinierte Methode nicht aufrufen
- 24. Wo kann ich gluUnproject aufrufen?
- 25. Warum kann ich File :: open (...). Read_to_end() aufrufen?
- 26. Kann Initialisierer für Typ nicht aufrufen: Swift2
- 27. Kann ich ASP.NET RegSQL aus Code aufrufen?
- 28. Kann jqGrid-Funktionen nicht mit aufrufen. Operator
- 29. Kann ein Midlet ein anderes Midlet aufrufen?
- 30. Wie kann ich eine JQuery-Funktion aufrufen?
ja. Sie können auf Felder auf einem Modell, aber nicht die Modelle Methoden – user2954587
Methoden haben nicht für mich arbeiten! –