我有如下所示的模型字段:
user=models.ForeignKey(CustomUser, null=True)
_corporate = models.CharField(max_length=10, null=True, db_column='corporate')
def set_corporate(self,value):
if self.user.corporateuser_set.all():
self._corporate = self.user.corporateuser_set.values_list('company', flat=True)
corporate= property(set_corporate)不知何故,set_corporate没有被评估,因此_corporate字段没有更新。
那我该怎么做才能让它起作用呢?这里最好的方法是什么?
我有另一个模型(CorporateUser),它与用户模型有一对多的关系,这只是为了澄清我的问题。
发布于 2013-12-09 12:05:04
你在很多方面都做错了。
首先,在python中以这种方式使用属性:
class A:
@property
def foo(self):
return self._foo
@foo.setter
def foo(self, value):
self._foo = value或者这样:
class A:
def get_foo(self):
return self._foo
def set_foo(self, value):
self._foo = value
foo = property(get_foo, set_foo)注意值是如何传递给setter的。不应该像你那样在那里计算。如果您需要自动评估公司价值,那么您不需要一个属性,您应该覆盖模型.save()方法,或者在那里侦听它的pre_save信号和更新字段。
第二,你不应该有条件地设置在策划人。Setter应始终将属性设置为传递的值。如下所示:
def set_corporate(self, value):
# If the list is empty then corporate becomes empty
self._corporate = \
self.user.corporateuser_set.values_list('company', flat=True)如果你违反了这条规则,你就会感到悲伤:
obj.corporate = 'hi'
# obj.corporate is now 'hi'
obj.corporate = ''
# obj.corporate is still 'hi'. WTF?第三,不应该将list分配给CharField。这是怎么回事?它可能会使它紧张。
第四,您甚至没有分配列表,而是分配queryset,更糟糕的是。
第五,实际上是在两行中执行两次相同的数据库请求。检查该值是否为空然后进行赋值的有效方法是重用相同的queryset:
corporates = self.user.corporateuser_set.values_list('company', flat=True)
if corporates:
# Stringify it explicitly and our way
self._corporate = ','.join(corporates)发布于 2013-12-09 10:28:49
这不是你使用属性的方式。 function的第一个参数,如果您那样使用它,就是getter方法。你甚至没有提供一个getter方法。您需要一个返回self._corporate值的函数。
https://stackoverflow.com/questions/20468164
复制相似问题