Czy istnieje sposób automatycznego dopełnienia pola w stosunku do poprzedniego ... np. Jeśli poprzedni rekord ma wartość 09-0001, wówczas następny rekord powinien być przypisane 09-0002 i tak jedno ... pomysły? Zastanawiam się nad przesłonięciem metody zapisu, ale jak dokładnie nie jestem tak pewny, to:Automatyczna inkrementacja wartości w Django w stosunku do poprzedniego
Odpowiedz
Django nie pozwoli Ci mieć więcej niż jednego AutoFielda w modelu i już posiadasz go dla swojego klucza podstawowego. Musisz więc przesłonić save i prawdopodobnie będziesz musiał spojrzeć wstecz na stół, aby dowiedzieć się, co zwiększać.
coś takiego:
class Product(models.Model):
code = models.IntegerField()
number = models.IntegerField()
...
def get_serial_number(self):
"Get formatted value of serial number"
return "%.2d-%.3d" % (self.code, self.product)
def save(self):
"Get last value of Code and Number from database, and increment before save"
top = Product.objects.order_by('-code','-number')[0]
self.code = top.code + 1
self.number = top.number + 1
super(Product, self).save()
# etc.
Należy pamiętać, że bez pewnego rodzaju blokowania w sposób zaoszczędzić można uruchomić na problem współbieżności (dwa wątki próbuje zachować te same wartości w kodzie i liczby).
AutoField to typ pola, którego Django używa dla właściwości "id" klasy podstawowej modelu, ale można go użyć do dodatkowej auto-korekcji pola.
Nie sądzę, że można wykonać formatowanie jak w przykładzie, ale dobrym podejściem byłoby utworzenie niestandardowego typu pola, który przesłania metodę save(), aby wykonać żądane formatowanie.
Zobaczę, czy mogę to zrobić ... Pomyślałem, że istnieje łatwiejszy sposób, jak pobranie wartości poprzedniego rekordu dla tego pola, a następnie dodanie do niego 1. W każdym razie dzięki –
w SQL:
+-------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+----------------+
| code | int(11) unsigned | NO | PRI | NULL | auto_increment |
+-------+------------------+------+-----+---------+----------------+
W Django:
self.code = None
self.number = top.number + 1
self.save() # or super(Product, self).save()
Po zapisaniu code
zostanie automatycznie zwiększona.
- 1. Obliczanie różnicy w stosunku do poprzedniego rekordu
- 2. Automatyczna inkrementacja podstawowa pozostawiając przerwy w zliczaniu
- 3. Automatyczna inkrementacja zmiennej w pętli while
- 4. Automatyczna inkrementacja Derby i Eclipselink UnitOfWork
- 5. Automatyczna inkrementacja kolumny innej niż tożsamość w serwerze sql
- 6. Automatyczna inkrementacja identyfikatora mysql nie rozpoczyna się od 0
- 7. Django Przekierowanie do poprzedniego widoku
- 8. Django: uzyskiwanie poprzedniego adresu URL
- 9. Auto-inkrementacja liter w Perlu
- 10. Django inlinemodeladmin walidacji - ale z ogólnego stosunku
- 11. "Względne adresy wirtualne" w stosunku do czego?
- 12. Preferuj niektóre funkcje w stosunku do ADL
- 13. Inkrementacja chara
- 14. Przekazywanie wartości do modemu Bootstrap w Django
- 15. Automatyczna wektoryzacja w LLVM
- 16. Jak utworzyć sekwencję Rx, uruchamiając zadania w stosunku do wartości oryginalnej sekwencji?
- 17. Programowo wróć do poprzedniego ViewController w Swift
- 18. Porównując zapis do poprzedniego rekordu w PostgreSQL
- 19. Efektywność: rekurencja w stosunku do pętli
- 20. Port wejścia/wyjścia w stosunku do QueueUserApc?
- 21. Udoskonalenie jena w stosunku do Bellmana-Forda
- 22. Wysokość w stosunku do stylizacji wysokości linii
- 23. Źródło zdarzenia w stosunku do oryginalnego źródła
- 24. Równolegle.Nie w stosunku do zwykłych wątków
- 25. pozycja kursora w stosunku do aplikacji
- 26. Określanie sieci 3G w stosunku do krawędzi
- 27. PostgreSQL, sprawdzanie daty w stosunku do "dzisiaj"
- 28. Podnoszenie wyjątku w stosunku do drukowania?
- 29. Pozycja etykiety matplotlib w stosunku do osi
- 30. Wkładka atomowa lub inkrementacja w ActiveRecord/Rails
, aby rozwiązać problemy z współbieżnością, możesz użyć 'top = Product.objects.select_for_update (nowait = True) .order_by ('- code', '- number') [0]' –
Tak, użyj 'select_for_update()', ale upewnij się, że Twój RDBMS obsługuje blokowanie rzędów! (ostatnio robią to MySQL i Postgres). – Seth