Django автоматическое увеличение полей
У меня есть 2 столбца Serial и Bag Мне нужно, чтобы они автоматически увеличивались, но на основе друг друга, а также на основе пользователя, который будет обновлять запись, поэтому каждый мешок должен иметь 100 серий и сбросить номер автоматически после достижения 100, затем начать снова с мешка номер 2 и поместить 100 серий в него и сбросить.
Например:
когда пользователь обновляет первую запись, сумка будет начинаться с номера 1 и серийник будет также номер 1, вторая запись сумка будет по-прежнему номер 1 и серийник будет изменен на номер 2 до достижения 100 серийников в одной сумке, тогда мы начнем снова с сумки номер 2 и серийника номер 1 и т.д. ...
Спасибо
То, как вы объясняете свой пример, немного запутано, но я попытаюсь дать вам ответ.
Я предполагаю, что "2 столбца с именами Serial и Bag" являются полями одной и той же модели и, как вы ответили в комментариях, " запись уже существует, но у нее пустые serial и bag", что означает, что автоинкремент начинается, когда запись обновляется. Наконец, вы упомянули первую и вторую записи, подразумевая, что в этой модели есть несколько записей. Основываясь на этих критериях, вы можете добавить метод сохранения в вашу модель:
# Sample model
class Record(models.Model):
bag = models.IntegerField(default=0, null=True)
serial = models.IntegerField(default=0, null=True)
created_at = models.DateTimeField(auto_now=True, null=True)
def save(self, *args, **kwargs):
# Ensures the record will only auto-increment during update
if self.created_at:
# Retrieves the object with the highest bag & serial value
latest_record = Record.objects.all().order_by('bag', 'serial').last()
# Incrementing logic
if latest_record.serial_no + 1 <= 100:
self.bag = latest_record.bag if latest_record.bag > 0 else 1
self.serial = latest_record.serial + 1
else:
self.bag = latest_record.bag + 1
self.serial = 1
super(Record, self).save(*args, **kwargs)
Теперь, каждый раз, когда вы пишете save как:
record = Record()
record.save()
Выполняется метод сохранения модели.
Вместо того, чтобы делать логику инкремента в python, где она подвержена условиям гонки, если несколько обновлений могут происходить одновременно, должна быть возможность перенести ее в базу данных.
Что-то вроде:
update foop set
bag=vala,
ser=valb
from (
select
case when ser >= 5 then bag+1 else bag end as vala,
case when ser >= 5 then 1 else ser+1 end as valb
from foop
order by bag desc nulls last,
ser desc nulls last
limit 1) as tt
where some_primarykey = %;
Возможно, можно можно перевести это в django ORM, но также может быть проще и читабельнее просто перевести это в сырой SQL или пронести через .extra()
в наборе запросов, чем пытаться впихнуть это.