2012-02-04 5 views
1

私はPythonオブジェクトのリストをDjangoモデルインスタンスと混合しており、フィルタリングのためにいくつかのフィールドで__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

なぜこの場合は非モデルインスタンスを使用しますか?

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

クールなアイディア:ちょうどオーバーライドEQ方法とダミーモデルのインスタンスを作成します!私はそれが好きです。私はどのように属性自体をオーバーライドするのか不思議に思うだろう...私は変えることができないプロパティを持つのは奇妙だ。 –

+0

なぜそれを無効にしますか?私はこのオーバーライドの目的を理解することは間違いありません...あなたはいくつかの例を挙げることができますか? – Tisho

+0

なぜ私はそれを無効にしたいのですか?これは学問的な質問です。 'SingleRelatedObjectDescriptor'はこのエラーを投げる' __set__'を持っています。属性自体を削除するにはどうしたらいいですか?属性をリセットするにはどうすればよいですか? –

関連する問題