2009-02-07 7 views
19

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.

+0

Dzięki za podzielenie się rozwiązanie. – Giacomo

+1

Jak bezpieczne jest to rozwiązanie, biorąc pod uwagę jednoczesne wnioski dotyczące tego samego wpisu? –

+0

Nie jestem pewien, czy w 100% zgadnę twój przypadek użycia. Czy możesz to zrobić w metodzie zapisu Entry? –

Odpowiedz

8

Można to zrobić:

def save(self, force_insert=False, force_update=False): 
    #if self.id is None: 
    self.version_number += 1 

    super(EntryVersion, self).save(force_insert, force_update) # Call the "real" save() method. 

która pochodzi bezpośrednio stąd:

http://docs.djangoproject.com/en/dev/topics/db/models/#overriding-predefined-model-methods

+0

Dzięki! Oczywiście muszę dodać nieco więcej logiki niż tylko zwiększenie numeru wersji (ponieważ prawdopodobnie nie będzie to domyślny numer ostatniej wersji), ale myślę, że zdecydowanie jest to kierunek, w którym muszę się udać; również dzięki za link, nie zauważyłem tego w dokumentach. –

+0

Zrobiłem coś takiego w jednym projekcie, ale skończyłem umieszczając logikę wewnątrz widoku, ponieważ było to prostsze i istniała tylko jedna metoda, która może stworzyć mój obiekt. – Tiago

+0

Mogę skończyć migrację do widoku, ale szczególnie chciałem mieć teraz tę Just Work w administratorze (ponieważ jestem na bardzo wczesnym etapie testowania i nie mam jeszcze żadnych ustawień widoków edycji). Dzięki jeszcze raz! –

Powiązane problemy