1

ここで提供されている例に従ってください: https://stackoverflow.com/a/10022244/1386588提供されているサンプル コードで問題が発生しています。

次の高度なフィルター定義が用意されています。

def build_filters(self, filters=None):
        if filters is None:
            filters = {}

        orm_filters = super(TaggedResource, self).build_filters(filters)

        if('query' in filters):
            query = filters['query']
            print query
            qset = (
                    Q(comment__icontains=query) |
                    Q(media_text__icontains=query)
                    )
            orm_filters.extend({'custom': qset})

そして、私が直面している問題は、 orm_filters がリストではなく辞書マッピングであるという事実です。したがって、次のエラーが表示されます。

"error_message": "'dict' object has no attribute 'extend'"

通常の dict オブジェクトの場合と同様に、キーと値のペアを追加しようとすると、次のようになります。

orm_filters['custom'] = qset

return orm_filters「カスタム」キーを追加しようとすると、次のエラーが発生します。

"error_message": "Cannot resolve keyword 'custom' into field. Choices are: comment, id, media_text, ..."

私が間違っていることについて何か考えはありますか?

私はしばらくの間、これに対する解決策を見つけようとしていましたが、運が悪かったので、ここで助けてくれてありがとう!

更新: 問題は、apply_filters をオーバーライドしようとしてインスタンス化されていないことだと思います:

def apply_filters(self, request, applicable_filters):
        print 'applied filters'
        if 'custom' in applicable_filters:
            custom = applicable_filters.pop('custom')
        else:
            custom = None

        semi_filtered = super(TaggedResource, self).apply_filters(request, applicable_filters)

        return semi_filtered.filter(custom) if custom else semi_filtered

これが、applicable_filters から取得した後に「custom」を削除するためにここで apply_filters メソッドを期待しているため、キーワード「custom」エラーを解決できない理由です。

私の apply_filters 定義の何が問題なのかわかりません。

4

1 に答える 1

1

変更してみてください:

orm_filters.extend({'custom': qset})

に:

orm_filters.update(**qset)

更新: (テスト済みコード)

def build_filters(self, filters=None):
    filters = filters

    applicable_filters = super(TaggedResource, self).build_filters(filters)

    query = filters.get('query')
    if query:
        qset = (
            Q(comment__icontains=query) |
            Q(media_text__icontains=query)
        )
        applicable_filters['custom'] = qset

    return applicable_filters

def apply_filters(self, request, applicable_filters):
    custom = None
    if 'custom' in applicable_filters:
        custom = applicable_filters.pop('custom')

    semi_filtered = super(TaggedResource, self).apply_filters(request, applicable_filters)

    return semi_filtered.filter(**custom) if custom else semi_filtered
于 2012-07-31T09:05:50.427 に答える