Обновление увеличивается, если значение равно Django

Я пытаюсь создать систему версий в django. Мне нужна отдельная версионность для каждого имени актива. Мне удалось настроить пользовательский инструмент инкремента, но я не могу понять, как проверить то, что я сейчас пытаюсь создать, на соответствие тому, что уже есть. Вот код, который я сейчас имею:

def next_version():
    latest = Asset.objects.order_by("version").last()

    if not latest:
        return 1

    return latest.version + 1


class Asset(models.Model):
    path = models.CharField(max_length=255, unique=True, primary_key=True)
    name = models.CharField(max_length=255)
    version = models.IntegerField(default=next_version)
    asset_type = models.CharField(max_length=255)
    created_at = models.DateTimeField(auto_now_add=True)
    created_by = models.CharField(max_length=255)
    dependencies = models.JSONField(null=True)

    def __str__(self):
        return self.name

Но проблема в том, что функция next_version не может прочитать имя актива, который я сейчас пытаюсь создать (или, по крайней мере, я думаю, что не может).

Итак, цель, которую я пытаюсь достичь, заключается в том, чтобы созданный актив проверил имя, которое он пытается установить, и, если оно уже существует, увеличил версию. Может ли кто-нибудь сказать, возможно ли это?

Редактирование: Я попробовал передать параметр name в поле next_version следующим образом:

def next_version(name):
    latest = Asset.objects.all().order_by("version").last()

    if not latest:
        return 1

    return latest.version + 1


class Asset(models.Model):
    path = models.CharField(max_length=255, unique=True, primary_key=True)
    name = models.CharField(max_length=255)
    version = models.IntegerField(default=next_version(name))
    asset_type = models.CharField(max_length=255)
    created_at = models.DateTimeField(auto_now_add=True)
    created_by = models.CharField(max_length=255)
    dependencies = models.JSONField(null=True)

    def __str__(self):
        return self.name

В результате возникает ошибка NameError: name 'Asset' is not defined

Спасибо, Митчелл

Измените свою функцию next_version. .last() будет пытаться вернуть экземпляр и вызовет исключение, если queryset пуст. Другая проблема заключается в том, что ваш метод, ссылающийся на класс, находится перед классом. Вы можете модифицировать метод next_version, как показано ниже, но лучше переписать метод save модели Asset, как показано внизу

def next_version(name):
  latest = Asset.objects.all().order_by("version")

  if not latest.exists():
      return 1

  return latest.last().version + 1

Вы можете перезаписать следующим образом....

class Asset(models.Model):
  path = models.CharField(max_length=255, unique=True, primary_key=True)
  name = models.CharField(max_length=255)
  version = models.IntegerField(default=1)  # Default to 1 initially
  asset_type = models.CharField(max_length=255)
  created_at = models.DateTimeField(auto_now_add=True)
  created_by = models.CharField(max_length=255)
  dependencies = models.JSONField(null=True)

  def __str__(self):
      return self.name

  def save(self, *args, **kwargs):
      # Check if an asset with the same name already exists
      existing_assets = Asset.objects.filter(name=self.name).order_by('-version')

      if existing_assets.exists():
          # If an asset with the same name exists, increment the version
          self.version = existing_assets.first().version + 1
      else:
          # If it's a new asset, set version to 1
          self.version = 1

      super().save(*args, **kwargs)
Вернуться на верх