2013-06-18 2 views
0

У меня есть следующие ресурсы:Tastypie: Фильтрация по ToManyField

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

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

так, что, когда я смотрю на спецификации JSON она включает в себя список результатов, которые имеют ForeignKey к этой спецификации. Теперь я хотел бы отфильтровать результаты, которые появляются, когда я смотрю на спецификацию JSON, и я хотел бы иметь возможность фильтровать через URL-адрес таким образом, чтобы вы отфильтровывали список спецификаций с помощью поля спецификации. Это возможно?

Чтобы проиллюстрировать это, я хотел бы перейти к «/ api/spec/1 /? Number = 5» и получить тот же JSON, который я получил бы, если бы пошел в «/ api/spec/1/"за исключением что поле результатов содержит только те результаты, которые имеют число = 5.

Возможно ли это в рамках татуировки?

ответ

2

Это было время, так как вы писали здесь, но вы можете найти кусок решения в ответе @kroolik дал мне в подобной ситуации, чтобы создать фильтр на «вложенный» ToManyField связанного ресурса: https://stackoverflow.com/a/20035610/1387495

Вот основная идея:

вы можете расширить свой атрибут аргумент вы перешли к результатов поля с функцией полномасштабной и повторное использованием ResultResource. res.obj_get_list обрабатывает создание и применение фильтров, как определено для вашего ResultResource. Вам просто нужно отфильтровать его дальше на parent_id.

В коде:

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

с

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) 

Еще раз, спасибо @kroolik, который показал мне этот трюк.

+0

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. –

+0

Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий ниже своего сообщения - вы всегда можете прокомментировать свои собственные сообщения, и как только у вас будет достаточно [репутации] (http://stackoverflow.com/help/whats-reputation), вы будете быть в состоянии [прокомментировать любое сообщение] (http://stackoverflow.com/help/privileges/comment). –

+0

@JB. Отметил, что я отредактировал свой ответ в соответствии с вашими требованиями. Благодаря! – Daemon12

Смежные вопросы