2009-06-30 15 views

Odpowiedz

8

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

+3

, 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]' –

+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

1

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.

+0

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 –

0

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.

Powiązane problemy