Django - campo de modelo personalizado virtual com campo companheiro armazenados

votos
0

Eu gostaria de ter um ConfirmationFieldtipo de campo. Eu quero este campo para trabalhar como um campo booleano. Eu não preciso para armazenar essas informações na base de dados em vez disso eu gostaria de armazenar a data de confirmação em um campo separado.

class MyModel(models.Model):
    confirmation = ConfirmationField()


m = MyModel()
m.confirmation # False
m.confirmation_timestamp # None

m.confirmation = True
m.save()

m.confirmation_timestamp # datetime object


m.confirmation = False
m.save()

m.confirmation_timestamp # None again

Eu preciso ter ambos os campos como Fieldcasos, eu preciso ser capaz de usá-los em administração, por exemplo.

Eu li a documentação e verificado o código, ForeignKeymuda seu nome da coluna banco de dados com o seguinte código:

def get_attname(self):
    return '%s_id' % self.name

Mas eu não conseguia descobrir exacly como eu posso usar o resto do código como um exemplo. Parece que meu objetivo não requer tto muita complexidade.

Descobri também ImageFieldsalva informações extras quando o modelo é salvo:

    if self.field.width_field:
        setattr(self.instance, self.field.width_field, self.width)
    if self.field.height_field:
        setattr(self.instance, self.field.height_field, self.height)

Mas é claro que eu não quero confirmation-se a ser armazenado no banco de dados. Eu faria com que a redundância uma vez que ( confirmation_timestamp-> confirmation) None== Falsee <datetime instance>== True.

Os ponteiros / idéias são apreciados.

Obrigado.

edit: Parece que este não é actualmente possível. Tenho acabou mudando minha API. Aqui está uma snipplet para dar uma idéia de como eu fiz isso:

    value = {'BooleanField': True,
             'DateTimeField': datetime.datetime.now(),
             'DateField': datetime.date.today(),
             'IntegerField': 1,
            }[instance._meta.get_field(field_name).get_internal_type()]
    setattr(instance, field_name, value)

Você pode ter um campo de confirmação qualquer tipo mencionado acima e define o valor correto. E verificação de confirmação pode ser feito com bool(getattr(instance, field_name).

Publicado 12/01/2009 em 15:21
fonte usuário
Em outras línguas...                            


1 respostas

votos
5

se eu tenho esse direito, considere:

class Modelname(models.Model):
    """(Modelname description)"""

    confirmation_timestamp = models.DateTimeField(blank=True)

    def _set_confirmation(self, value):
        if not value:
            self.confirmation_timestamp = None
        else:
            self.confirmation_timestamp = datetime.datetime.now()

    def _get_confirmation(self):
        return bool(self.confirmation_timestamp)

    confirmation = property(_get_confirmation, _set_confirmation)
    confirmation.short_description = "Confirmation"
    confirmation.boolean = True # have it nicely displayed in admin
Respondeu 12/01/2009 em 15:32
fonte usuário

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