3

次の API 定義を考えると、製品エイリアスでイベントをフィルタリングできる必要があります。

Event が Job に属し、Job が Product に属していることを考えると、それをどのように仕様化すればよいかわかりません。

api.py:

class ProductResource(ModelResource):

    class Meta:
        queryset = Product.objects.all()
        resource_name = 'product'
        allowed_methods = ['get']
        excludes = ['created_at','updated_at']
        filtering = {
            'alias': ALL
        }

class EnvironmentResource(ModelResource):

    class Meta:
        queryset = Environment.objects.all()
        resource_name = 'environment'
        allowed_methods = ['get']
        excludes = ['created_at','updated_at']

class JobResource(ModelResource):

    product = fields.ForeignKey(ProductResource, 'product')

    class Meta:
        queryset = Job.objects.all()
        resource_name = 'job'
        allowed_methods = ['get']
        excludes = ['created_at','updated_at']

class EventResource(ModelResource):

    environment = fields.ForeignKey(EnvironmentResource, 'environment',full=True)
    job = fields.ForeignKey(JobResource, 'job',full=True)

    class Meta:
        queryset = Event.objects.all()
        resource_name = 'event'
        allowed_methods = ['get']
        excludes = ['created_at','updated_at']
        filtering = {
            HOW DO I FILTER BY PRODUCT ALIAS????
        }
4

2 に答える 2

11

次のフィルタリング仕様が与えられます。

# In EventResource
filtering = { 
   'job' : ALL_WITH_RELATIONS
}

# In JobResource
filtering = { 
   'product' : ALL_WITH_RELATIONS
}

# In ProductResource
filtering = {
    'alias' : ALL
}

次のことができるはずです。

/api/events/job__product__alias=something
于 2012-04-16T10:36:40.573 に答える
0

これを実現する簡単な方法は、Advanced Filteringです。これにより、tastypie の ForeignKey フィールドによって生成される多くのクエリが回避されます。セキュリティのため、データを に追加する前に、フィルタ入力データを手動で検証または消去することを忘れないでくださいorm_filters

class EventResource(ModelResource):

    class Meta:
        queryset = Event.objects.all()
        resource_name = 'event'
        allowed_methods = ['get']

    def build_filters(self, filters=None):

        if filters is None:
            filters = {}

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

        # Your filtering
        if 'job__product__alias' in filters:
            orm_filters['job__product__alias'] = filters.get(
                'job__product__alias')

    return orm_filters

それらを実行して、フィルタリングされた結果を取得できるはずです。

/api/events/?job__product__alias=something
于 2015-01-21T04:42:59.673 に答える