2009-06-30 13 views
6

Bir alanı bir öncekine göre otomatik olarak düzeltmenin bir yolu var mıdır ... örn. Önceki kayıt 09-0001 değerine sahipse, sonraki kayıt 09-0002 atandı ve bir tane ... fikirler? Kaydetme yöntemini geçersiz kılmayı düşünüyorum, ancak tam olarak nasıl emin değilim?Otomatik, Django'da bir öncekine göre bir değer artar

cevap

8

Django, bir modelde birden fazla AutoField uygulamanıza izin vermez ve birincil anahtarınız için zaten bir tane vardır. Dolayısıyla, kaydetmeyi geçersiz kılmanız gerekecek ve muhtemelen nelerin artacağını anlamak için masaya geri bakmanız gerekecektir. Böyle

şey: senin kaydetmek yönteminde kilitleme çeşit olmadan, siz (kod ve sayı olarak aynı değerleri depolamak için çalışıyor iki konuları) bir eşzamanlılık sorun çıkıyor ki

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. 

Not. SQL

+3

eşzamanlılık sorunlarını çözmek için teşekkürler top = Product.objects.select_for_update (nowait = True) .order_by ('- kod', '- sayı') [0] ' –

+0

Evet, select_for_update()' kullanın, ama RDBMS’inizin önce satır kilitlemeyi desteklediğinden emin olun! (son MySQL ve Postgres yapar). – Seth

1

AutoField, Django'nun '' id 'özelliğine sahip model taban sınıfı için kullandığı alan türüdür, ancak daha fazla otomatik olarak doldurmak için kullanabilirsiniz. alanlar.

Örneğinizde herhangi bir biçimlendirme yapabileceğinizi sanmıyorum, ancak iyi bir yaklaşım, istenen biçimlendirmeyi gerçekleştirmek için save() yöntemini geçersiz kılan özel bir alan türü yapmak olabilir.

+0

Bunu yapıp yapamayacağımı göreceğim ... Bir önceki kaydın bu alandaki değerini almak ve daha sonra ona 1 eklemek gibi daha kolay bir yol olduğunu düşündüm. Her neyse –

0

:

+-------+------------------+------+-----+---------+----------------+ 
| Field | Type    | Null | Key | Default | Extra   | 
+-------+------------------+------+-----+---------+----------------+ 
| code | int(11) unsigned | NO | PRI | NULL | auto_increment | 
+-------+------------------+------+-----+---------+----------------+ 

Django içinde:

self.code = None 
self.number = top.number + 1 
self.save() # or super(Product, self).save() 

kurtardı, code otomatik artırılacaktır.

İlgili konular