Chcę wykonać kod w modelu Django, gdy jest on tworzony po raz pierwszy. Później, gdy zostanie zapisany, chcę wykonać inny kod. Drugie zadanie można łatwo wykonać, zastępując metodę save(). Jak mogę wykonać pierwsze zadanie?Wykonywanie kodu podczas tworzenia modelu w Django
6
A
Odpowiedz
9
Można użyć django signals 'post_save
:
# models.py
from django.db.models import signals
class MyModel(models.Model):
pass
def my_model_post_save(sender, instance, created, *args, **kwargs):
"""Argument explanation:
sender - The model class. (MyModel)
instance - The actual instance being saved.
created - Boolean; True if a new record was created.
*args, **kwargs - Capture the unneeded `raw` and `using`(1.3) arguments.
"""
if created:
# your code goes here
# django 1.3+
from django.dispatch import dispatcher
dispatcher.connect(my_model_post_save, signal=signals.post_save, sender=MyModel)
# django <1.3
from django.db.models.signals import post_save
post_save.connect(my_model_post_save, sender=MyModel)
21
Rozszerzanie sdolan' s answer za pomocą receiver
dekorator:
from django.db import models
from django.dispatch import receiver
class MyModel(models.Model):
pass
@receiver(models.signals.post_save, sender=MyModel)
def execute_after_save(sender, instance, created, *args, **kwargs):
if created:
# code
+2
To właśnie działa teraz z django 1.10, zamiast akceptowanej odpowiedzi, która była prawdopodobnie poprawna dla wcześniejszych wersji. – LisaD
Powiązane problemy
- 1. Wykonywanie kodu przy starcie w Django 1.7
- 2. Django - Wykonywanie zadań przez selera z modelu
- 3. Jak pobrać identyfikator modelu podczas tworzenia nowego?
- 4. Zatrzymaj wykonywanie kodu C#
- 5. Django - Utwórz profil użytkownika podczas tworzenia użytkownika
- 6. Błąd polecenia django-admin podczas tworzenia projektu
- 7. Wykonywanie kodu php w Pythonie
- 8. Wzorce projektowe Django - formularze do tworzenia i aktualizowania modelu
- 9. Pole modelu w Django
- 10. Uszkodzenie modelu domeny POCO podczas tworzenia klas jednostek LINQ?
- 11. Wykonywanie kodu prologu na iPhonie
- 12. Dlaczego otrzymuję AssociationTypeMismatch podczas tworzenia mojego obiektu modelu?
- 13. wykonywanie kodu przed jakimkolwiek działaniem
- 14. UUID jako wartość domyślna w modelu Django
- 15. Python factory_boy biblioteka m2m w modelu Django?
- 16. Wartość domyślna dla pola w modelu Django
- 17. Wykonywanie kodu JavaScript "na miejscu" w Chrome?
- 18. Wykonywanie kodu PHP w ciągu znaków
- 19. przerwij wykonywanie kodu w wątku po 30s
- 20. Pobieranie kodu i wykonywanie w locie
- 21. Wstrzymaj wykonywanie kodu JavaScript w interfejsie UIWebView
- 22. Zatrzymuję wykonywanie kolejnego kodu w java
- 23. Android: wykonywanie kodu w regularnych odstępach czasu
- 24. Kontrola współbieżności w modelu Django
- 25. Wykonywanie przeszukiwania stylu getattr() w szablonie django
- 26. Błąd znaku kodu podczas tworzenia aplikacji na telefon iPhone
- 27. Błąd podczas tworzenia raportu pokrycia kodu przy pomocy JaCoCo
- 28. Metoda modelu Django - create_or_update
- 29. Django modelu Tag projekt
- 30. Dlaczego django musi używać podwójnego podkreślenia podczas tworzenia zapytań filtrów?
próbowałem tego, ale został otrzymuję błąd. Okazało się, że używam wersji Django (1, 1, 1, "końcowy", 0), a to działa tylko dla Django 1.3 i wyżej. Spróbuję dokonać aktualizacji, ale czy znasz inną metodę? Dzięki! –
@Rohit: Jaki był błąd w wersji 1.1.1? Sygnały te istniały w wersji 1.1.1, konfiguracja może być trochę inna lub mam literówkę. – sdolan
@RohitAgarwal: Zerknąłem na stare dokumenty i zaktualizowałem dół mojego przykładu, co powinno działać dla 1.1.1. – sdolan