Django - Custom virtual model field with companion stored field [closed]

你。 提交于 2020-01-03 05:12:08

问题


I would like to have a ConfirmationField field type. I want this field to work like a boolean field. I don't need to store this information on database instead I would like to store the date of confirmation on a seperate field.

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

I need to have both fields as Field instances, I need to be able to use them in Admin for example.

I have read the docs and checked the code, ForeignKey changes its database column name with the following code:

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

But I couldn't figure out exacly how I can use the rest of the code as an example. It seems my goal doesn't require tto much complexity.

I have also found ImageField saved extra information when the model is saved:

    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)

But of course I don't want confirmation itself to be stored in the database. I would cause redundancy since (confirmation_timestamp -> confirmation) None==False and <datetime instance>==True.

Any pointers/ideas are appreciated.

Thanks.

edit: It appears this is not currently possible. I have ended up changing my API. Here is a snipplet to give an idea how I did it:

    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)

You can have a confirmation field any type mentioned above and it sets the correct value. And confirmation checking can be done with bool(getattr(instance, field_name).


回答1:


if I got this right, consider:

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


来源:https://stackoverflow.com/questions/435544/django-custom-virtual-model-field-with-companion-stored-field

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!