Django-filter: рдпрджрд┐ рдлрд╝рд┐рд▓реНрдЯрд░рд╕реЗрдЯ рдореЗрдВ рдлрд╝реАрд▓реНрдб рдирд╣реАрдВ рджрд┐рдП рдЧрдП рд╣реИрдВ рддреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рдЙрдард╛рдПрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 28 рд╕рд┐рддре░ 2016  ┬╖  11рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: carltongibson/django-filter

class BooksFilter(filters.FilterSet):
    class Meta:
        model = Books

рдлрд╝рд┐рд▓реНрдЯрд░рд╕реЗрдЯ рд╡рд░реНрдЧ (рдКрдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ) рдореЗрдВ fields рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЫреЛрдбрд╝рддреЗ рд╕рдордп, рд╕рднреА рдореЙрдбрд▓ рдлрд╝реАрд▓реНрдб рдлрд╝рд┐рд▓реНрдЯрд░рд╕реЗрдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдпрд╣ рдбреАрдЖрд░рдПрдл рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рд╕реВрдЪрдирд╛ рд░рд┐рд╕рд╛рд╡ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдлрд╝реЙрд░реНрдо рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдПрдкреАрдЖрдИ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

Django рдФрд░ DRF рджреЛрдиреЛрдВ рдХреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд╕реБрд░рдХреНрд╖рд╛ рдореБрджреНрджреЛрдВ рдХреЗ рдХрд╛рд░рдг рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ рдлреЙрд░реНрдо/рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ django-filter рдлрд╝рд┐рд▓реНрдЯрд░рд╕реЗрдЯ рдореЗрдВ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
http://www.django-rest-framework.org/api-guide/serializers/#specifying -who-fields-to-include
https://docs.djangoproject.com/hi/1.10/topics/forms/modelforms/#selecting -the-fields-to-use

рдореБрдЭреЗ рдПрдХ рдкреАрдЖрд░ рдХреЗ рд╕рд╛рде рдпреЛрдЧрджрд╛рди рдХрд░рдиреЗ рдпрд╛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рд╕рдордЭрд╛рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛ рд░рд╣реА рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЬрд░реВрд░рдд рдкрдбрд╝рдиреЗ рдкрд░ рд╕реВрдЪрдирд╛ рд░рд┐рд╕рд╛рд╡ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

btw - рдбреЗрдЯрд╛ рд░рд┐рд╕рд╛рд╡ рдХреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ #451 рджреНрд╡рд╛рд░рд╛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЕрднреА рдЖрдкрдХреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд/рдмрджрд▓рддреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣рд┐рд╖реНрдХрд░рдг рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдВ рджреЗрдЦрдиреА рдЪрд╛рд╣рд┐рдПред 1.0 рдореЗрдВ, рдирдпрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдиреБрдкрд╕реНрдерд┐рдд Meta.fields рдпрд╛ Meta.fields = None рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╕рднреА 11 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

@ nip3o рд╣рд╛рдВред рдпрд╣ рджреЗрдЦрдХрд░ рдЦреБрд╢реА рд╣реБрдИред

рдореИрдВ рдпрд╣ рднреА рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдбреАрдЖрд░рдПрдл рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдлрд╝реАрд▓реНрдб рдХреЛ рдШреЛрд╖рд┐рдд рдлрд╝рд┐рд▓реНрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ, рдЬрдм рдЖрдк рдЗрд╕ рдкрд░ рд╣реЛрдВ...

btw - рдбреЗрдЯрд╛ рд░рд┐рд╕рд╛рд╡ рдХреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ #451 рджреНрд╡рд╛рд░рд╛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЕрднреА рдЖрдкрдХреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд/рдмрджрд▓рддреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣рд┐рд╖реНрдХрд░рдг рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдВ рджреЗрдЦрдиреА рдЪрд╛рд╣рд┐рдПред 1.0 рдореЗрдВ, рдирдпрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдиреБрдкрд╕реНрдерд┐рдд Meta.fields рдпрд╛ Meta.fields = None рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рдпрд╣ рднреА рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдбреАрдЖрд░рдПрдл рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдлрд╝реАрд▓реНрдб рдХреЛ рдШреЛрд╖рд┐рдд рдлрд╝рд┐рд▓реНрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ, рдЬрдм рдЖрдк рдЗрд╕ рдкрд░ рд╣реЛрдВ

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ Meta.fields рдХреЗ рд▓рд┐рдП dict рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг:

class UserFilter(filters.FilterSet):
    username = filters.CharFilter()

    class Meta:
        model = User
        fields = {
            'name': ['contains', 'startswith', 'endswith', ...'],
            ???
        }

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рддрд╛рдирд╛рд╢рд╛рд╣реА рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВред

рдореИрдВ рдЕрднреА рднреА рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╣реВрдВ: -1: рдЗрд╕ рдкрд░ред рдореБрдЭреЗ Meta.fields dict рд╕рд┐рдВрдЯреИрдХреНрд╕ w/рдШреЛрд╖рд┐рдд рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред рдХрдо рд╕реЗ рдХрдо, рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдЬреЛ рдЕрдЬреАрдм рди рд╣реЛ:

class UserFilter(filters.FilterSet):
    username = filters.CharFilter(name='username', lookup_expr='exact')
    username_like = filters.CharFilter(name='username', lookup_expr='icontains')
    relevance = filters.CharFilter(method='filter_relevance')

    class Meta:
        model = User
        fields = {
            'name': ['contains', 'startswith', 'endswith', ...'],
            'username': ['exact'],  # match w/ the lookup_expr? 
            'username_like': ['icontains'],
            'relevance': [???]  # What about method filters?
        }

рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдпрд╣ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╕реНрдЯрдо рдореЙрдбрд▓ рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рдЪрд▓рддреА рд╣реИ рдЬреЛ FilterSet.FILTER_DEFAULTS рдореЗрдВ рдорд┐рд▓реА рдлрд╝реАрд▓реНрдб рдХреНрд▓рд╛рд╕ рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВред рдХрд╕реНрдЯрдо рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

class NetworkSettingFilter(FilterSet):
    mask = MaskFilter(...)

    class Meta:
        model = NetworkSetting
        fields = ['mask']
        filter_overrides = {
            SubnetMaskField: {'filter_class': MaskFilter},
        }

# vs.

class NetworkSettingFilter(FilterSet):
    mask = MaskFilter(...)

    class Meta:
        model = NetworkSetting

рд╕рд╛рдЗрдб рдиреЛрдЯ: рдпрд╣ рдмрд╛рдж рдХрд╛ рдмрд┐рдВрджреБ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдСрдЯреЛ-рдкреАрдврд╝реА рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдбреАрдЬреЗрдЧреЛ рдХреЗ рдореЙрдбрд▓ рд░реВрдкреЛрдВ рдХреА рддрд░рд╣ рдбреАрдЖрд░рдПрдл рдХреЗ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХреЛрдВ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рдореЗрд░реА рдореБрдЦреНрдп рдЪрд┐рдВрддрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕рдВрдШрд░реНрд╖ рд╣реИред

рдареАрдХред рдЪрд▓реЛ рдЗрд╕реЗ рдЕрднреА рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрдВред

рдореБрдЭреЗ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд╕рдВрдж рд╣реИред рдореИрдВ рдЗрд╕реЗ _рдЕрдЧрд░ fields рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддреЛ рдПрдХ рд╕реВрдЪреА рд╣реИ..._ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рд╕реЛрдЪрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рдереЛрдбрд╝рд╛ рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдореВрд▓ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдореАрд▓ рдХрд╛ рдкрддреНрдерд░ рдмрдирд╛рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред

рдпрд╛ рддреЛ fields рдпрд╛ exclude рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред fields = '__all__' рдиреНрдпреВрдирддрдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

(рдпрд╣ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдирд╛ рдХрд┐ рд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рдорд┐рд▓рд╛рди рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рд╣рдо рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддреЗ рд╣реИрдВред)

рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдбреАрдЖрд░рдПрдл рдХреЛрдб рдпрд╣рд╛рдВ рд╣реИ :

        assert not (fields is None and exclude is None), (
            "Creating a ModelSerializer without either the 'fields' attribute "
            "or the 'exclude' attribute has been deprecated since 3.3.0, "
            "and is now disallowed. Add an explicit fields = '__all__' to the "
            "{serializer_class} serializer.".format(
                serializer_class=self.__class__.__name__
            ),
        )

рд╣рдореЗрдВ filters_for_model рдореЗрдВ рдПрдХ рд╕рдорд╛рди рдЬреЛрдбрд╝ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

    # Setting exclude with no fields implies all other fields.
    if exclude is not None and fields is None:
        fields = ALL_FIELDS

рдЗрд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣рд┐рд╖реНрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдпрд╛ рддреЛ fields рдпрд╛ exclude рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред fields = '__all__' рдиреНрдпреВрдирддрдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рдкреАрдЫреЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рдкреАрдЖрд░ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред

рдардВрдбрд╛ред

рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ, рдореВрд▓реНрдпрд╣реНрд░рд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдордд рдХрд░реЛред рдпрд╣ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдмрджрд▓рд╛рд╡ рд╣реИ, рдПрдХ рдмрдбрд╝реЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ред рдмрд╕ рдЗрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрди рдиреЛрдЯреЛрдВ рдореЗрдВ рдХреЙрд▓ рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред рдореИрдВ

рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ, рдореВрд▓реНрдпрд╣реНрд░рд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдордд рдХрд░реЛред рдпрд╣ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдмрджрд▓рд╛рд╡ рд╣реИ, рдПрдХ рдмрдбрд╝реЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ред рдмрд╕ рдЗрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрди рдиреЛрдЯреЛрдВ рдореЗрдВ рдХреЙрд▓ рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред

рдЗрд░рд╛рджрд╛ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдХрд╡рд░ рдХрд┐рдпрд╛ рд╣реИред

рд╕рд╛рде рд╣реА, рдШреЛрд╖рд┐рдд рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рд▓рд┐рдП рдлрд╝рд┐рд▓реНрдЯрд░ рдЬрдирд░реЗрд╢рди рдХрд╛ рдкреНрд░рдпрд╛рд╕ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдореЗрдВ filters_for_model рдХреЛ рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред (рдпрд╣ рд╕рдмрдиреЗрдЯ/рдорд╛рд╕реНрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ рдЬрд╣рд╛рдВ fields = ['mask'] рдПрдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЕрдкрд╡рд╛рдж рдЙрдард╛рдПрдЧрд╛ред

#550 . рджреНрд╡рд╛рд░рд╛ рдмрдВрдж

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

edmorley picture edmorley  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jnegro picture jnegro  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

gotexis picture gotexis  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ses4j picture ses4j  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

csarcom picture csarcom  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ