一尘不染

属性对Django模型字段有效吗?

django

我认为最好的方法是使用一些代码…我可以这样做吗?(编辑:答案:否)

class MyModel(models.Model):    
    foo = models.CharField(max_length = 20)    
    bar = models.CharField(max_length = 20)  

    def get_foo(self):  
        if self.bar:  
            return self.bar  
        else:  
            return self.foo  

    def set_foo(self, input):  
        self.foo = input  

    foo = property(get_foo, set_foo)  

还是我必须这样做:

是的,您必须这样做:

class MyModel(models.Model):
    _foo = models.CharField(max_length = 20, db_column='foo')
    bar = models.CharField(max_length = 20)

    def get_foo(self):
        if self.bar:
            return self.bar
        else:
            return self._foo

    def set_foo(self, input):
        self._foo = input

    foo = property(get_foo, set_foo)

注意:您可以通过将db_column传递给model字段来在数据库中将列名保持为’foo’。当您在现有系统上工作并且不想无缘无故进行数据库迁移时,这非常有用


阅读 382

收藏
2020-03-29

共1个答案

一尘不染

模型字段已经是属性,所以我要说第二种方法是避免名称冲突。

定义时,foo = property(..)它实际上将覆盖该foo = models..行,因此该字段将不再可访问。

你需要为属性和字段使用其他名称。实际上,如果按照示例1的方式进行操作,则在尝试访问该属性时将获得一个无限循环,因为该属性现在试图返回自身。

编辑:也许你还应该考虑不用_foo作字段名称,而是foo,然后为属性定义另一个名称,因为不能在中使用属性QuerySet,因此例如在进行过滤时,你将需要使用实际的字段名称。 。

2020-03-29