我认为最好的方法是使用一些代码…我可以这样做吗?(编辑:答案:否)
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’。当您在现有系统上工作并且不想无缘无故进行数据库迁移时,这非常有用
模型字段已经是属性,所以我要说第二种方法是避免名称冲突。
定义时,foo = property(..)它实际上将覆盖该foo = models..行,因此该字段将不再可访问。
foo = property(..)
foo = models
你需要为属性和字段使用其他名称。实际上,如果按照示例1的方式进行操作,则在尝试访问该属性时将获得一个无限循环,因为该属性现在试图返回自身。
编辑:也许你还应该考虑不用_foo作字段名称,而是foo,然后为属性定义另一个名称,因为不能在中使用属性QuerySet,因此例如在进行过滤时,你将需要使用实际的字段名称。 。
_foo
foo
QuerySet