2012-02-04 38 views
1

我有一個Django模型實例混合的Python對象列表,並且需要在某些字段上過載__eq__運算符以進行過濾。這工作正常,直到我碰到一個ForeignKey由於只接受特定模型實例的屬性引發錯誤。如何覆蓋ForeignKey只讀字段?強制刪除一個屬性?

如何覆蓋此屬性?即使刪除它會很好,因爲我沒有在模板中使用它。

這種模式的原因是,在某些條件下,我希望某些屬性總是匹配每個對象的傳入搜索參數(我在搜索的對象中有通配符,而不是搜索查詢)。

class AlwaysEqual(object): 
    def __eq__(self, a): 
     return True 

for i in bag_of_objects: 
    if certain_conditions_met: 
     i.foo = AlwaysEqual() 
     # ValueError: Cannot assign "AlwaysEqual": "ProductFile.option1" must be a "ProductOptionValue" instance. 
     # is there a way to delete this attribute? 

     del i.foo 
     # AttributeError: __delete__ 

回答

0

爲什麼在這種情況下使用非模型實例?只要創建一個假人模型實例與被覆蓋的EQ方法:

class MyDjangoModel(models.Model): 
    match_always = False 

    def __eq__(self, obj): 
     if (self.match_always): 
      return True 
     return self.id == obj.id 

    ..... 

always_equal = MyDjangoModel() 
always_equal.match_always = True 


for i in bag_of_objects: 
    if certain_conditions_met: 
     i.foo = always_equal 
+0

很酷的想法!我喜歡。我很好奇如何重寫屬性本身...雖然有一個屬性我無法改變,這很奇怪。 – 2012-06-10 16:38:03

+0

你爲什麼要重寫它?我不太清楚這個覆蓋的目的......你能舉一些例子嗎? – Tisho 2012-06-10 16:51:27

+0

爲什麼我想重寫它並不重要:這是一個學術問題。 'SingleRelatedObjectDescriptor'有一個'__set__'引發這個錯誤。我怎樣才能刪除屬性本身。如何重置屬性? – 2012-06-10 16:58:00