Обновление увеличивается, если значение равно 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)