Есть ли способ автоматического увеличения поля Django по отношению к внешнему ключу? - PullRequest
21 голосов
/ 07 февраля 2009

В настоящее время я кодирую сайт в 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, чтобы это работало.

Возможно, есть лучший способ, но, похоже, он работает именно так, как мне нужно; надеюсь, другие тоже найдут это полезным.

1 Ответ

9 голосов
/ 07 февраля 2009

Вы можете сделать это:

def save(self, force_insert=False, force_update=False):
    #if self.id is None:
    self.version_number += 1

    super(EntryVersion, self).save(force_insert, force_update) # Call the "real" save() method.

, который приходит прямо отсюда:

http://docs.djangoproject.com/en/dev/topics/db/models/#overriding-predefined-model-methods

...