2017-01-24 3 views
0

Я только что начал кодирование в DRF, и я столкнулся с проблемой, когда мне приходится искать из соответствующего внешнего ключа.Django Rest Framework Связанная фильтрация полей

У меня есть 2 модели, BookDetails и BookCopies.

BookCopies имеет BookDetails, на который он ссылается как внешний ключ.

Теперь я хочу найти BookCopies, используя заголовок атрибута, который находится в модели BookDetails.

Я использовал django_rest_framework_filters следующим образом, но он дает ошибку при посещении http://localhost:8000/book/copy/?book_details__title=abc.

class BookFilter(FilterSet): 
    class Meta: 
     model = BookDetail 
     fields = { 
      'title': ['exact', 'in', 'startswith'], 
      'author': ['exact', 'in', 'startswith'], 
      'editor': ['exact', 'in', 'startswith'], 
      'publisher': ['exact', 'in', 'startswith'], 
      'cl_num': ['exact', 'in', 'startswith'] 
     } 


class CopyFilter(FilterSet): 
    book_details = RelatedFilter(BookFilter, name="title", queryset=BookDetail.objects.all()) 

    class Meta: 
     model = BookCopy 
     fields = { 
      'ref_id': ['exact', 'in', 'startswith'] 
     } 

Посмотреть

class CopyListAPIView(ListAPIView): 
    serializer_class = CopyViewSerializer 
    queryset = BookCopy.active_objects.all() 
    filter_backends = [DjangoFilterBackend] 
    filter_class = CopyFilter 

Serializer

class CopyViewSerializer(ModelSerializer): 
    class Meta: 
     model = BookCopy 
     fields = "__all__" 

след Ошибка

KeyError at /book/copy/ 
'book_details__title' 
Request Method: GET 
Request URL: http://localhost:8000/book/copy/?book_details__title=abc 
Django Version: 1.10.5 
Exception Type: KeyError 
Exception Value:  
'book_details__title' 
Exception Location: /Applications/MAMP/htdocs/python/01-virtual-env/lib/python2.7/site-packages/django_filters/filterset.py in qs, line 335 
Python Executable: /Applications/MAMP/htdocs/python/01-virtual-env/bin/python 
Python Version: 2.7.10 
Python Path:  
['/Applications/MAMP/htdocs/library-new/services', 
'/Applications/MAMP/htdocs/python/01-virtual-env/lib/python27.zip', 
'/Applications/MAMP/htdocs/python/01-virtual-env/lib/python2.7', 
'/Applications/MAMP/htdocs/python/01-virtual-env/lib/python2.7/plat-darwin', 
'/Applications/MAMP/htdocs/python/01-virtual-env/lib/python2.7/plat-mac', 
'/Applications/MAMP/htdocs/python/01-virtual-env/lib/python2.7/plat-mac/lib-scriptpackages', 
'/Applications/MAMP/htdocs/python/01-virtual-env/lib/python2.7/lib-tk', 
'/Applications/MAMP/htdocs/python/01-virtual-env/lib/python2.7/lib-old', 
'/Applications/MAMP/htdocs/python/01-virtual-env/lib/python2.7/lib-dynload', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', 
'/Applications/MAMP/htdocs/python/01-virtual-env/lib/python2.7/site-packages', 
'/Applications/MAMP/htdocs/python/01-virtual-env/lib/python2.7/site-packages/Django-1.10.5-py2.7.egg', 
'/Applications/MAMP/htdocs/python/01-virtual-env/lib/python2.7/site-packages/MySQL_python-1.2.5-py2.7-macosx-10.12-intel.egg'] 
Server time: Tue, 24 Jan 2017 13:35:36 +0000 

Пожалуйста, помогите. Thank You

+0

Можете ли вы разместить свой отзыв? – Fian

+0

Также укажите вид, который вы используете? – Linovia

+0

Привет, мне очень жаль, что я немного опоздал, чтобы ответить. Я обновил вопрос с помощью tracebackback, и я использую вид –

ответ

0

Для получения желаемого результата вам необходимо предоставить аргумент name, равный related_name в модели. По умолчанию оно равно имени поля в FilterSet. Поэтому, если это book_details, вы можете просто пропустить его.

class CopyFilter(FilterSet): 
    book_details = RelatedFilter(BookFilter, name="book_details", queryset=BookDetail.objects.all() 

Кстати, в вашем стеке ошибок нет стека.

+0

Я попробовал. Не работает. Тот же вопрос. Я прибегал к этому в представлении. def get_queryset (self): и использовал это для выполнения специальной фильтрации, которую я хотел –

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