Автоматическое увеличение значения в Django по отношению к предыдущему

StackOverflow https://stackoverflow.com/questions/1065089

  •  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 будет увеличен автоматически.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top