Obecnie koduję witrynę w Django (ponieważ nigdy nie można się nauczyć zbyt wielu frameworków!) I zastanawiam się, czy istnieje sposób automatycznego przyrostu obiektu w odniesieniu do powiązanego obiektu. Tak na przykład, że mam model wjazdu i model EntryVersion:Czy istnieje sposób automatycznego zwiększania wartości pola Django w odniesieniu do klucza obcego?
Entry
- tytuł
- ślimak
EntryVersion
- wejście (klucz obcy)
- version_numer
- treść
Chcę automatycznie zwiększać wartość version_number
w odniesieniu do klucza obcego wejścia (tak, że wpis może mieć kilka wersji, zaczynając od jednego i przesuwając się w górę o jeden). Nie będzie to jednak prawdziwy auto-inkrement, ponieważ nie będzie unikalny w bazie danych (może być wiele wersji wejściowych z number_wersji = 1, tylko jeden dla danego wpisu).
Wiem, że mógłbym zrzucić własnego administratora i poradzić sobie z tym, ale zastanawiałem się, czy jest jakiś sposób, aby administrator Django automatycznie zwiększał numer wersji o jeden, gdy tylko zostanie zapisana nowa wersja wpisu.
Edit: specyficzny kod, który kiedyś (skorygowana tylko ustawić numer wersji na pierwszy zapis)
odpowiedź Tiago był w porządku, ale w interesie przyszłych użytkowników stackoverflow z podobnymi dylematami, oto specyficzny kod, który kiedyś:
def save(self, force_insert=False, force_update=False):
# Only modify number if creating for the first time (is default 0)
if self.version_number == 0:
# Grab the highest current index (if it exists)
try:
recent = EntryVersion.objects.filter(entry__exact=self.entry).order_by('-version_number')[0]
self.version_number = recent.version_number + 1
except IndexError:
self.version_number = 1
# Call the "real" save() method
super(EntryVersion, self).save(force_insert, force_update)
order_by
w/index Sztuką jest jednym I zbierana z dokumentacją Django tutaj:
http://docs.djangoproject.com/en/dev/topics/db/queries/#id4
Należy pamiętać, że trzeba mieć default=0
określono na polu version_number
to zadziałało.
Może istnieć lepszy sposób, ale wygląda na to, że działa dokładnie tak, jak potrzebowałem; mam nadzieję, że inni również uznają to za przydatne.
Dzięki za podzielenie się rozwiązanie. – Giacomo
Jak bezpieczne jest to rozwiązanie, biorąc pod uwagę jednoczesne wnioski dotyczące tego samego wpisu? –
Nie jestem pewien, czy w 100% zgadnę twój przypadek użycia. Czy możesz to zrobić w metodzie zapisu Entry? –