简体   繁体   中英

Tastypie: Filtering by ToManyField

I have the following resources:

class SpecResource(ModelResource):
    results = fields.ToManyField('(...).ResultResource', 'result_set', full=True)
    (...)

class ResultResource(ModelResource):
    number = fields.IntegerField()
    spec = fields.ForeignKey('(...).SpecResource', 'spec')
    (...)

so that when I look at a spec JSON it includes a list of the results that have a ForeignKey to that spec. Now I'd like to filter the results that show up when I look at a spec JSON, and I'd like to be able to filter through the URL in the way that you'd filter a list of specs by a field of the specs. Is that possible?

To illustrate further, I'd like to go to "/api/spec/1/?number=5" and get the same JSON that I'd get if I went to "/api/spec/1/" except that the results field only contains those results that have number = 5.

Is this possible within tastypie's framework?

It's been a while since you posted here, but you may find a piece of solution in the answer @kroolik gave me in a similar situation, to build a filter on a 'nested' ToManyField-related resource: https://stackoverflow.com/a/20035610/1387495

Here is the main idea:

You can extend your attribute argument you've passed to the results field with a full-scale function and reuse the ResultResource . The res.obj_get_list handles building and applying filters as defined per your ResultResource . You just need to filter it further on parent_id .

In the code:

class SpecResource(ModelResource):
    results = fields.ToManyField('(...).ResultResource', attribute=lambda bundle: filter_result_items(bundle), full=True)

with

def filter_result_items(bundle):
    res = ResultResource()
    new_bundle = Bundle(request=bundle.request)
    objs = res.obj_get_list(new_bundle)
    return objs.filter(parent_id=bundle.obj.pk)

Once again, thank @kroolik, who showed me this trick.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM