Existe uma forma de auto-incrementar um campo Django com relação a uma chave estrangeira?

votos
19

Atualmente estou codificação um site em Django (porque você nunca pode aprender muitas estruturas!), E estou querendo saber se há uma maneira de auto-incremento de um objeto em relação a um objeto relacionado. Assim, por exemplo, dizer que tenho um modelo de entrada e um modelo EntryVersion:

Entrada
- título
- lesma

EntryVersion
- entrada (chave estrangeira)
- version_number
- conteúdo

Quero auto-incremento version_numbercom respeito à chave estrangeira entrada (para que uma entrada pode ter várias versões, a partir de um e se movendo para cima por um). Não vai ser um verdadeiro auto-incremento, no entanto, porque não vai ser único no banco de dados (pode haver muitas versões de entrada com version_number = 1; apenas um único para um dado de entrada).

Eu sei que eu poderia fazer a minha própria administração e apenas lidar com isso lá, mas queria saber se havia alguma maneira de ter a administração do Django aumentar o número da versão por um sempre que uma nova versão de entrada é salvo automaticamente.


Edit: código específico que eu usei (corrigido apenas definir o número versão no primeiro salvar)

A resposta de Tiago estava certo, mas no interesse dos futuros StackOverflow usuários com dilemas semelhantes, aqui está o código específico que eu usei:

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)

O order_bytruque w / index é um que eu adquirida a partir da documentação do Django aqui:

http://docs.djangoproject.com/en/dev/topics/db/queries/#id4

Note que você deve ter default=0definido em seu version_numbercampo para que isso funcione.

Pode haver uma maneira melhor, mas isso parece estar funcionando exatamente do jeito que eu precisava; espero que outros também vai encontrá-lo útil.

Publicado 07/02/2009 em 03:27
fonte usuário
Em outras línguas...                            


1 respostas

votos
8

Você consegue fazer isso:

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.

que vem diretamente a partir daqui:

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

Respondeu 07/02/2009 em 11:04
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more