5

重複の可能性:
Django Tastypie高度なフィルタリング:Qオブジェクトを使用して複雑なルックアップを実行する方法

私は次のようなおいしいmodelRseourceを持っています:

class TaggedResource(ModelResource):
    tags = ListField()
    user = fields.ForeignKey(UserProfileResource, 'user')

    class Meta:
        queryset = Media.objects.all().order_by('-timestamp')
        authorization = MediaAuthorization()
        detail_allowed_methods = ['get', 'post', 'put', 'delete','patch']

    filtering = {
        #'user': ALL_WITH_RELATIONS,
        #exact is date, lt is less than lte less than equal to, etc
        'timestamp': ['exact', 'range', 'lt', 'lte', 'gte', 'gt'],
        'social_source': ALL,
        'media_type': ALL,
        'comment': ['exact', 'startswith', 'endswith', 'contains'],
        'media_text': ['exact', 'startswith', 'endswith', 'contains'],
    }

フィルタ間にOR演算子が必要で、クエリを1つのパラメータに結合したいと思います。たとえば、コメントフィールドまたはmedia_textフィールドから「test」フィルタリングという単語を含むオブジェクトを返したいとします。

これは理想的です:http:mysite.com/api/v1/tagged?q = test

ここで、「q」は両方のフィールドに対してORフィルターを実行します。

これは実行可能ですか?

更新:これが私が高度なフィルターで取り組んでいることですが、ORステートメントを取得する方法がよくわかりません:

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

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

    if 'q' in filters:
        orm_filters['comment__contains'] = filters['q']
        orm_filters['media_text__contains'] = filters['q'] 
    return orm_filters  
4

2 に答える 2

4

あなたはbuild_filtersをオーバーライドすることで正しいことをしています、あなたはAND / ORクエリのためにdjangoのQクラスを使うことができます、私はここで同様の質問に答えました

複数の値を使用したおいしいフィルタリング

そしてここにもう一つの興味深いものがあります:

Tastypie否定フィルター

于 2012-07-28T09:32:18.527 に答える
1

実行可能かどうかはわかりませんが、高度なフィルタリングを検討することをお勧めします。ただし、build_filtersをオーバーライドすると、リソース全体にアクセスでき、フィールド以上に渡るそのようなフィルターを定義できる可能性があります。

于 2012-07-27T23:56:07.040 に答える