你在這麼多方面做錯了。
首先,屬性在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)
注意值是如何傳遞給制定者。它不應該像你那樣在那裏計算。如果您需要自動更新企業價值,那麼您不需要財產,您應該覆蓋模型.save()
方法或聆聽它的pre_save
信號並在那裏更新字段。
其次,你不應該有條件地設置setter。 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
。這應該如何工作?它可能會將其串聯起來。
第四,你甚至沒有分配一個列表,你正在分配查詢集,這是更糟。
第五,你在兩行中執行兩次基本相同的數據庫請求。檢查的有效途徑,如果是空的,然後分配是通過重用相同的查詢集:
corporates = self.user.corporateuser_set.values_list('company', flat=True)
if corporates:
# Stringify it explicitly and our way
self._corporate = ','.join(corporates)
'違反這條規則你會引起悲傷:'什麼 規則? – user2454305
安裝員應無條件設置。 – Suor
爲了您的解釋,我接受您的答案。它很詳細,但我不同意使用save()的選項。我認爲最好的方法是使用財產虛擬領域。它似乎現在工作良好,不知道它的效率是否會持續下去:-) – user2454305