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
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
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.
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 –
:
+-------+------------------+------+-----+---------+----------------+
| 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.
- 1. Otomatik Tamamlama SearchBar - Bir değer hücresi değil
- 2. Bir ilerleme çubuğu nasıl güncellenir, böylece düzgün bir şekilde artar?
- 3. pandas dataframe, kopyaya göre değer
- 4. Gösterge formuna göre değer girişi
- 5. Değer sayılarına göre bir DataFrame pandasını nasıl filtrelerim?
- 6. Neden bir değer döndürmüyor?
- 7. Yeni bir değer eklendiğinde tablo görünümü nasıl otomatik açılır
- 8. İlk değerden başka bir değer seçildiğinde nasıl otomatik olarak açılır?
- 9. Bir divanın içeriğine göre otomatik olarak genişlik kazanmasını sağlayabilirsiniz
- 10. Kubernetes'te, bir kuyruğun boyutuna göre nasıl otomatik ölçeklendirilirim?
- 11. Matplotlib - bir değer z
- 12. , bir değer dizini
- 13. Bir değişkene neden farklı bir değer atayabilirim?
- 14. MIPS'de neden bellek sayısı 4 artar?
- 15. 1D dizisinden bir değer çıkartın
- 16. Ayrıştırma LPTSTR * komut satırı, hatayla artar :: program_options
- 17. XML işlevi değer sorununa göre mi?
- 18. Özel DropDownFor yükleme Varlığa göre değer
- 19. Nesne nesnelerini değer tamsayısına göre filtreleme
- 20. Aynı satır değerlerine göre değer bulun
- 21. window.open'den bir değer döndürme
- 22. Python'daki her yeni nesne için neden 2 artar?
- 23. Bir işlevden bir değer döndürülemiyor
- 24. Değer türleri birbirinden dökülebiliyorken neden bir değer türünde bir sözlüğü başka bir değer türünde sözlüğe dönüştüremiyorum?
- 25. Etiketle birlikte otomatik tamamlama, değer değil
- 26. Java'da otomatik olarak değer değiştirmeyi nasıl önlerim
- 27. Özellikler için değer otomatik olarak nasıl oluşturulur?
- 28. Baskı awk çiftler olarak belirli bir sütun göre belirli bir değer aralığı içinde olan tüm satırları
- 29. Subilime göre otomatik python kod biçimlendirme
- 30. JFrame'in içeriğe göre otomatik olarak yeniden boyutlandırılması
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] ' –
Evet, select_for_update()' kullanın, ama RDBMS’inizin önce satır kilitlemeyi desteklediğinden emin olun! (son MySQL ve Postgres yapar). – Seth