Автоматический инкремент значение в Django относительно предыдущего

Просто - код будет работать нормально, если многие потоки исполняют этот код одновременно.

6
задан 30 June 2009 в 18:01
поделиться

2 ответа

Django не позволит вам иметь более одного AutoField в модели, а у вас уже есть одно для вашего первичного ключа. Таким образом, вам придется переопределить сохранение и, вероятно, придется вернуться к таблице, чтобы выяснить, что увеличивать.

Примерно так:

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.

Обратите внимание, что без какой-либо блокировки в вашем методе сохранения вы можете столкнуться с проблемой параллелизма (два потока пытаются сохранить одни и те же значения в коде и номере).

8
ответ дан 10 December 2019 в 00:42
поделиться

AutoField - это тип поля, который Django использует для свойства id базового класса модели, но вы можете использовать его для дополнительных автоинкрементируемых полей.

Я не думаю, что вы можете это сделать. любое форматирование, как в вашем примере, но хорошим подходом было бы создание настраиваемого типа поля, который переопределяет метод save () для выполнения желаемого форматирования.

1
ответ дан 10 December 2019 в 00:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: