2017-01-24 1 views
0

Je viens de commencer à coder dans DRF et j'ai rencontré un problème où je dois chercher à partir d'une clé étrangère.Django Rest Framework Filtrage de champs connexes

J'ai 2 modèles, BookDetails et BookCopies.

BookCopies est référencé BookDetails en tant que clé étrangère.

Maintenant, je veux rechercher BookCopies en utilisant le titre de l'attribut qui est dans le modèle BookDetails.

J'ai utilisé django_rest_framework_filters comme suit mais cela donne une erreur quand je visite 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'] 
     } 

Voir

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

sérialiseur

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

Erreur trace

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 

S'il vous plaît aider. Merci

+0

Pouvez-vous poster votre traceback d'erreur? – Fian

+0

Indiquez également la vue que vous utilisez également? – Linovia

+0

Salut, vraiment désolé j'ai eu un peu de retard pour répondre. J'ai mis à jour la question avec la trace d'erreur et la vue que j'utilise –

Répondre

0

Pour obtenir le comportement souhaité, vous devez fournir name argument égal à related_name dans le modèle. Par défaut, il est égal au nom du champ dans FilterSet. Donc, si c'est book_details, vous pouvez simplement l'ignorer.

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

Par ailleurs, il n'y a pas de pile dans votre pile d'erreurs.

+0

Je l'ai essayé. N'a pas fonctionné. Même problème. J'ai eu recours à cela dans la vue. def get_queryset (self): et utilisé pour faire le filtrage personnalisé que je voulais –