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.
, 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