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() в наборе запросов, чем пытаться впихнуть это.

Вернуться на верх