Автоматическое увеличение значения в Django по отношению к предыдущему
-
21-08-2019 - |
Вопрос
Есть ли способ автоинкрементировать поле относительно предыдущего ... например, если предыдущая запись имеет значение 09-0001, то следующей записи должно быть присвоено значение 09-0002 и так далее ... идеи?Я подумываю о переопределении метода сохранения, но как именно, я не уверен
Решение
Django не позволит вам иметь более одного автозаполя в модели, и у вас уже есть одно для вашего первичного ключа.Таким образом, вам придется переопределить сохранение, и, вероятно, вам придется еще раз заглянуть в таблицу, чтобы понять, что нужно увеличить.
Что - то вроде этого:
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.
Обратите внимание, что без какой-либо блокировки в вашем методе сохранения вы можете столкнуться с проблемой параллелизма (два потока пытаются сохранить одни и те же значения в code и number).
Другие советы
AutoField - это тип поля, который Django использует для свойства id базового класса модели, но вы можете использовать его для дополнительных автоматически создаваемых полей.
Я не думаю, что вы можете выполнить какое-либо форматирование, как в вашем примере, но хорошим подходом было бы создать пользовательский тип поля, который переопределяет метод save () для выполнения желаемого форматирования.
в SQL:
+-------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+----------------+
| code | int(11) unsigned | NO | PRI | NULL | auto_increment |
+-------+------------------+------+-----+---------+----------------+
В Django:
self.code = None
self.number = top.number + 1
self.save() # or super(Product, self).save()
При сохранении code
будет увеличен автоматически.