Просто - код будет работать нормально, если многие потоки исполняют этот код одновременно.
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.
Обратите внимание, что без какой-либо блокировки в вашем методе сохранения вы можете столкнуться с проблемой параллелизма (два потока пытаются сохранить одни и те же значения в коде и номере).
AutoField - это тип поля, который Django использует для свойства id базового класса модели, но вы можете использовать его для дополнительных автоинкрементируемых полей.
Я не думаю, что вы можете это сделать. любое форматирование, как в вашем примере, но хорошим подходом было бы создание настраиваемого типа поля, который переопределяет метод save () для выполнения желаемого форматирования.