do properties work on django model fields?

前端 未结 4 695
既然无缘
既然无缘 2020-11-29 22:21

I think the best way to ask this question is with some code... can I do this? (edit: ANSWER: no)

class MyModel(models.Model):    
    foo =          


        
4条回答
  •  自闭症患者
    2020-11-29 22:59

    As mentioned, a correct alternative to implementing your own django.db.models.Field class, one should use - db_column argument and a custom (or hidden) class attribute. I am just rewriting the code in the edit by @Jiaaro following more strict conventions for OOP in python (e.g. if _foo should be actually hidden):

    class MyModel(models.Model):
        __foo = models.CharField(max_length = 20, db_column='foo')
        bar = models.CharField(max_length = 20)
    
        @property
        def foo(self):
            if self.bar:
                return self.bar
            else:
                return self.__foo
    
        @foo.setter
        def foo(self, value):
            self.__foo = value
    

    __foo will be resolved into _MyModel__foo (as seen by dir(..)) thus hidden (private). Note that this form also permits using of @property decorator which would be ultimately a nicer way to write readable code.

    Again, django will create *_MyModel table with two fields foo and bar.

提交回复
热议问题