@@ -818,3 +818,106 @@ class Query(ObjectType):
818818 }
819819 """
820820 )
821+
822+
823+ def test_filter_filterset_based_on_mixin ():
824+ class ArticleFilterMixin (FilterSet ):
825+ @classmethod
826+ def get_filters (cls ):
827+ filters = super (FilterSet , cls ).get_filters ()
828+ filters .update (
829+ {
830+ "viewer__email__in" : django_filters .CharFilter (
831+ method = "filter_email_in" , field_name = "reporter__email__in"
832+ )
833+ }
834+ )
835+
836+ return filters
837+
838+ def filter_email_in (cls , queryset , name , value ):
839+ return queryset .filter (** {name : [value ]})
840+
841+ class NewArticleFilter (ArticleFilterMixin , ArticleFilter ):
842+ pass
843+
844+ class NewReporterNode (DjangoObjectType ):
845+ class Meta :
846+ model = Reporter
847+ interfaces = (Node ,)
848+
849+ class NewArticleFilterNode (DjangoObjectType ):
850+ viewer = Field (NewReporterNode )
851+
852+ class Meta :
853+ model = Article
854+ interfaces = (Node ,)
855+ filterset_class = NewArticleFilter
856+
857+ def resolve_viewer (self , info ):
858+ return self .reporter
859+
860+ class Query (ObjectType ):
861+ all_articles = DjangoFilterConnectionField (NewArticleFilterNode )
862+
863+ reporter_1 = Reporter .objects .create (
864+ first_name = "John" , last_name = "Doe" , email = "john@doe.com"
865+ )
866+
867+ article_1 = Article .objects .create (
868+ headline = "Hello" ,
869+ reporter = reporter_1 ,
870+ editor = reporter_1 ,
871+ pub_date = datetime .now (),
872+ pub_date_time = datetime .now (),
873+ )
874+
875+ reporter_2 = Reporter .objects .create (
876+ first_name = "Adam" , last_name = "Doe" , email = "adam@doe.com"
877+ )
878+
879+ article_2 = Article .objects .create (
880+ headline = "Good Bye" ,
881+ reporter = reporter_2 ,
882+ editor = reporter_2 ,
883+ pub_date = datetime .now (),
884+ pub_date_time = datetime .now (),
885+ )
886+
887+ schema = Schema (query = Query )
888+
889+ query = (
890+ """
891+ query NodeFilteringQuery {
892+ allArticles(viewer_Email_In: "%s") {
893+ edges {
894+ node {
895+ headline
896+ viewer {
897+ email
898+ }
899+ }
900+ }
901+ }
902+ }
903+ """
904+ % reporter_1 .email
905+ )
906+
907+ expected = {
908+ "allArticles" : {
909+ "edges" : [
910+ {
911+ "node" : {
912+ "headline" : article_1 .headline ,
913+ "viewer" : {"email" : reporter_1 .email },
914+ }
915+ }
916+ ]
917+ }
918+ }
919+
920+ result = schema .execute (query )
921+
922+ assert not result .errors
923+ assert result .data == expected
0 commit comments