В настоящее время я кодирую сайт в Django (потому что вы никогда не сможете изучить слишком много фреймворков!), И мне интересно, есть ли способ автоматического увеличения объекта по отношению к связанному объекту. Например, скажем, у меня есть модель Entry и модель EntryVersion:
запись
- название
- слизняк
EntryVersion
- запись (внешний ключ)
- номер версии
- содержание
Я хочу автоматически увеличить version_number
по отношению к внешнему ключу записи (чтобы запись могла иметь несколько версий, начиная с одной и перемещаясь вверх на одну). Однако это не будет истинным автоматическим приращением, поскольку он не будет уникальным в базе данных (может быть много версий записей с version_number = 1; только одна для данной записи).
Я знаю, что могу прокрутить своего собственного администратора и просто обработать это там, но мне было интересно, есть ли способ заставить администратора Django автоматически увеличивать номер версии на единицу при каждом сохранении новой версии записи.
Редактировать: определенный код, который я использовал (исправлено только для установки номера версии при первом сохранении)
Ответ Тиаго был верным, но в интересах будущих пользователей StackOverflow с подобными дилеммами вот конкретный код, который я использовал:
def save(self, force_insert=False, force_update=False):
# Only modify number if creating for the first time (is default 0)
if self.version_number == 0:
# Grab the highest current index (if it exists)
try:
recent = EntryVersion.objects.filter(entry__exact=self.entry).order_by('-version_number')[0]
self.version_number = recent.version_number + 1
except IndexError:
self.version_number = 1
# Call the "real" save() method
super(EntryVersion, self).save(force_insert, force_update)
Уловка order_by
с индексом, которую я почерпнул из документации по Django:
http://docs.djangoproject.com/en/dev/topics/db/queries/#id4
Обратите внимание, что в вашем поле version_number
должно быть определено default=0
, чтобы это работало.
Возможно, есть лучший способ, но, похоже, он работает именно так, как мне нужно; надеюсь, другие тоже найдут это полезным.