Django-rest-framework: рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐рдпреЛрдВ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░реЗрдВред

рдХреЛ рдирд┐рд░реНрдорд┐рдд 23 рдЕрдХреНрддреВре░ 2014  ┬╖  26рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: encode/django-rest-framework

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдВрдмрдВрдз рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЗ рд╕рдорд╛рди рд╕реЗрдЯ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рджреГрд╢реНрдпреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЛ рд╕рдВрдмрдВрдзреЛрдВ рдкрд░ рдЕрдиреБрдорддрд┐ рдпрд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рдЖрдкрдХреЛ рдЗрд╕рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдЗрд╕рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдХрдо рд╕реЗ рдХрдо рдмреЗрд╣рддрд░ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрднреА рдореЗрд░реА рд░рд╛рдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЙрджрд╛рд╣рд░рдг рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЖрдк рдЗрд╕рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗред рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХреЛрдб рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреИрдХреЗрдЬ рд▓реЗрдЦрдХреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЕрдиреНрдп рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдФрд░ рдпрд╣ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡реЗ рдХрд┐рд╕реА рднреА рдЕрдЪреНрдЫреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХреЛрд░ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ 'рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди' рд╕реЗ 'рдПрдиреНрд╣рд╛рдВрд╕рдореЗрдВрдЯ' рдореЗрдВ рдкреНрд░рдЪрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рддрдХ рдХреЛрдИ рдареЛрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдирд╣реАрдВ рд╣реИ рдЬреЛ рддреАрд╕рд░реЗ рднрд╛рдЧ рдкреИрдХреЗрдЬ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИ рддреЛ рдпрд╣ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд░рд╣реЗрдЧрд╛ред

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

рдореИрдВрдиреЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдХреНрд╡реЗрд░реАрд╕реЗрдЯ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕рд░рд▓ рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдорд┐рдХреНрд╕рд┐рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ:

class FilterRelatedMixin(object):
    def __init__(self, *args, **kwargs):
        super(FilterRelatedMixin, self).__init__(*args, **kwargs)
        for name, field in self.fields.iteritems():
            if isinstance(field, serializers.RelatedField):
                method_name = 'filter_%s' % name
                try:
                    func = getattr(self, method_name)
                except AttributeError:
                    pass
                else:
                    field.queryset = func(field.queryset)

рдЙрдкрдпреЛрдЧ рднреА рд╕рд░рд▓ рд╣реИ:

class SocialPageSerializer(FilterRelatedMixin, serializers.ModelSerializer):
    account = serializers.PrimaryKeyRelatedField()

    class Meta:
        model = models.SocialPage

    def filter_account(self, queryset):
        request = self.context['request']
        return queryset.filter(user=request.user)

рдпрд╣ рдХреИрд╕рд╛ рд╣реИ? рдХреНрдпрд╛ рдЖрдк рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рджреЗрдЦрддреЗ рд╣реИрдВ?

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

рдореИрдВрдиреЗ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреБрджрд╛рдИ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЛ "has_object_permission" рдХреЙрд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрднреА, рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдХреЗ рдкрд╛рд╕ рдЕрдиреБрдорддрд┐ рд╡рд╕реНрддреБ рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИред

рдЕрднреА, рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдХреЗ рдкрд╛рд╕ рдЕрдиреБрдорддрд┐ рд╡рд╕реНрддреБ рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИред

рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдпрд╣ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИред

_рдХреМрди рд╕реА_ рдЕрдиреБрдорддрд┐ рд╡рд╕реНрддреБ? рдпреЗ _other_ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рд╕рдВрдмрдВрдз рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рджреГрд╢реНрдп рдкрд░ рдЕрдиреБрдорддрд┐ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрдХреНрд╖рд╛рдПрдВ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рд╡рд╣реА рдирд┐рдпрдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдВрдмрдВрдзреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рд╣рд╛рдЗрдкрд░рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рд░рд┐рд╢реНрддреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдЙрд╕ рджреГрд╢реНрдп рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЙрдиреНрд╣реЛрдВрдиреЗ (+) рдкрд░ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдерд╛ рдФрд░ рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ/рдЕрдиреБрдорддрд┐рдпрд╛рдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рдереЗ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рднрдпрд╛рдирдХ рдХрд╕рдХрд░-рдпреБрдЧреНрдорд┐рдд рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЧреИрд░-рд╣рд╛рдЗрдкрд░рд▓рд┐рдВрдХреНрдб рд░рд┐рд╢реНрддреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдк рдРрд╕рд╛ рднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЗрд╕ рдмрд╛рдд рдХреА рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбрд▓ рдПрдХ рдмрд╛рд░ рдПрдХрд▓ рд╡рд┐рд╣рд┐рдд рджреГрд╢реНрдп рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЙрди рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЧреИрд░-рд╣рд╛рдЗрдкрд░рд▓рд┐рдВрдХреНрдб рд╕рдВрдмрдВрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

(+) рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рднреА _sensible_ рддрд░реАрдХреЗ рд╕реЗ рдРрд╕рд╛ рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдЗрдП рдЗрд╕ рд╕рдордп рдХрд╛ рдирд╛рдЯрдХ рдХрд░реЗрдВред

рд╢рд╛рдпрдж рдПрдХ "has__permission"? рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрдорддрд┐ рд╡рд╕реНрддреБ рддрдм рдпрд╣ рдмрддрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧреА рдХрд┐ рдХреМрди рд╕реА рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╕реНрддреБрдПрдБ рджреЗрдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред

рд▓реЛрдЧ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рд╡реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ? рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд░ рдпрд╣ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ, рддреЛ рд╢рд╛рдпрдж рдлрд┐рд▓реНрдЯрд░ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред

рд╕рдВрджрд░реНрднрд┐рдд рдореБрджреНрджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ #1646 рд╕рдВрдмрдВрдзрд┐рдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдмреНрд░рд╛рдЙрдЬрд╝ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдПрдкреАрдЖрдИ рдкреГрд╖реНрдареЛрдВ рдкрд░ рджрд┐рдЦрд╛рдП рдЧрдП рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред

рдореБрдЭреЗ рдмреНрд░рд╛рдЙрдЬрд╝ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдПрдкреАрдЖрдИ рдкрд╕рдВрдж рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рди рдХреЗрд╡рд▓ рдореЗрд░реЗ рд▓рд┐рдП рдмреИрдХрдПрдВрдб рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд▓реНрдХрд┐ рдЖрд░рдИрдПрд╕рдЯреА рдПрдкреАрдЖрдИ рдХреЗ рдлреНрд░рдВрдЯ рдПрдВрдб рдбреЗрд╡рд▓рдкрд░реНрд╕/рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рднреА рдПрдХ рдЕрдЪреНрдЫрд╛ рдЯреВрд▓ рд╣реИред рдореБрдЭреЗ рдмреНрд░рд╛рдЙрдЬрд╝ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдЙрддреНрдкрд╛рдж рдХреЛ рд╢рд┐рдк рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ (рдпрд╛рдиреА .. рдпрд╣ рддрдм рднреА рдЪрд▓рддрд╛ рд╣реИ рдЬрдм рд╕рд╛рдЗрдЯ DEBUG рдореЛрдб рдореЗрдВ рдЕрдХреЗрд▓реА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ)ред рдореЗрд░реЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдмреНрд░рд╛рдЙрдЬрд╝ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдПрдкреАрдЖрдИ рдкреГрд╖реНрдареЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реВрдЪрдирд╛ рд░рд┐рд╕рд╛рд╡ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред (рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реИ рдХрд┐ рд╡реЗ рдкреГрд╖реНрда рдЖрдо рддреМрд░ рдкрд░ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВ)ред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА HTML рдкреГрд╖реНрдареЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реАрдЦрдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдкреЛрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реАрдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдЧреАред

рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд┐рд╢реНрд░рд┐рдд рд╡рд░реНрдЧ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬреЛ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝реАрд▓реНрдб рдХреЗ рджреГрд╢реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

class RelatedFieldPermissionsSerializerMixin(object):
    """
    Limit related fields based on the permissions in the related object's view.

    To use, mixin the class, and add a dictionary to the Serializer's Meta class
    named "related_queryset_filters" mapping the field name to the string name 
    of the appropriate view class.  Example:

    class MySerializer(serializers.ModelSerializer):
        class Meta:
            related_queryset_filters = {
                'user': 'UserViewSet',
            }

    """
    def __init__(self, *args, **kwargs):
        super(RelatedFieldPermissionsSerializerMixin, self).__init__(*args, **kwargs)
        self._filter_related_fields_for_html()

    def _filter_related_fields_for_html(self):
        """
        Ensure thatk related fields are ownership filtered for
        the browseable HTML views.
        """
        import views
        try:
            # related_queryset_filters is a map of the fieldname and the viewset name (str)
            related_queryset_filters = self.Meta.related_queryset_filters
        except AttributeError:
            related_queryset_filters = {}
        for field, viewset in related_queryset_filters.items():
            try:
                self.fields[field].queryset = self._filter_related_qs(self.context['request'], getattr(views, viewset))
            except KeyError:
                pass

    def _filter_related_qs(self, request, ViewSet):
        """
        Helper function to filter related fields using
        existing filtering logic in ViewSets.
        """
        view = ViewSet()
        view.request = request
        view.action = 'retrieve'
        queryset =  view.get_queryset()
        try:
            return view.queryset_ownership_filter(queryset)
        except AttributeError:
            return queryset

рдореИрдВрдиреЗ рдЗрд╕реЗ рдПрдХ рд╡реНрдпреВ рдорд┐рдХреНрд╕рд┐рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛: #1935 рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдФрд░ рд╡реНрдпреВ рдХреЛ рдорд┐рд▓рд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдпред рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрдЬрд╛рдп, рдореИрдВрдиреЗ рдЕрднреА рджреГрд╢реНрдп рдкрд░ secured_fields рдХреА рдПрдХ рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред

рдореИрдВрдиреЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдХреНрд╡реЗрд░реАрд╕реЗрдЯ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕рд░рд▓ рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдорд┐рдХреНрд╕рд┐рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ:

class FilterRelatedMixin(object):
    def __init__(self, *args, **kwargs):
        super(FilterRelatedMixin, self).__init__(*args, **kwargs)
        for name, field in self.fields.iteritems():
            if isinstance(field, serializers.RelatedField):
                method_name = 'filter_%s' % name
                try:
                    func = getattr(self, method_name)
                except AttributeError:
                    pass
                else:
                    field.queryset = func(field.queryset)

рдЙрдкрдпреЛрдЧ рднреА рд╕рд░рд▓ рд╣реИ:

class SocialPageSerializer(FilterRelatedMixin, serializers.ModelSerializer):
    account = serializers.PrimaryKeyRelatedField()

    class Meta:
        model = models.SocialPage

    def filter_account(self, queryset):
        request = self.context['request']
        return queryset.filter(user=request.user)

рдпрд╣ рдХреИрд╕рд╛ рд╣реИ? рдХреНрдпрд╛ рдЖрдк рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рджреЗрдЦрддреЗ рд╣реИрдВ?

рдореЗрд░реЗ рд▓рд┐рдП, рдореИрдВ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдФрд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрд░реНрдХ рд░рдЦрдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рджреГрд╢реНрдп рдореЗрдВ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реВрдВред

рд╕рдорд╕реНрдпрд╛ рд╕рдВрдмрдВрдзрд┐рдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╣реИред рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рджреГрд╢реНрдп рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛ рд╕рдХрддреА рд╣реИ рд▓реЗрдХрд┐рди
рд╕рднреА рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред

рдмреБрдз, рдирд╡рдВрдмрд░ 5, 2014 рдХреЛ рд╢рд╛рдо 6:16 рдмрдЬреЗ, рдПрд▓реЗрдХреНрд╕ рд░реЛрдердмрд░реНрдЧ рд╕реВрдЪрдирд╛рдПрдВ @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

рдореЗрд░реЗ рд▓рд┐рдП, рдореИрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдФрд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрд░реНрдХ рдХреЛ рдмрд╛рд╣рд░ рд░рдЦрдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ
Serializer рдФрд░ рдЙрд╕ рджреГрд╢реНрдп рдореЗрдВ рдЫреЛрдбрд╝ рджреЗрдВред

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/tomchristie/django-rest-framework/issues/1985#issuecomment -61873766
.

рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдкрдврд╝реЗрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рд╖рдп рд╣реИред рд╣рдо рд╡рд┐рдХрд▓реНрдк рд╡рд┐рдзрд┐ рдФрд░ рдкреЛрд╕реНрдЯ рдпрд╛ рдкреБрдЯ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдореЗрдЯрд╛ (рдореЙрдбрд▓рд╕реЗрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░) рдХреА рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝реАрд▓реНрдб рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдХреИрд╕реЗ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

https://groups.google.com/forum/#!topic/django -rest-framework/jMePw1vS66A

рдпрджрд┐ рд╣рдо рдореЙрдбрд▓ = рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рд╛рдЗрдорд░реАрдХреЗрд░рд┐рд▓реЗрдЯреЗрдбрдлрд┐рд▓реНрдб (рдХреНрд╡реЗрд░реАрд╕реЗрдЯ = рдореЙрдбрд▓.рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕.рдХреЛрдИ рдирд╣реАрдВ ()), рддреЛ рд╣рдо рд╕рдВрдмрдВрдзрд┐рдд рдореЙрдбрд▓ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рд╕рд╛рде рд╡рд░реНрддрдорд╛рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд╣реЗрдЬ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕реАрд▓рд╛рдЗрдЬрд╝рд░ рдкреНрд░рд╛рдЗрдорд░реАрдХреЗрд░рд┐рд▓реЗрдЯреЗрдбрдлрд┐рд▓реНрдб "рдлрд╝реАрд▓реНрдб рдЗрдирдкреБрдЯ рдХреЛ рдорд╛рдиреНрдп рдХрд░рддреЗ рд╕рдордп рдореЙрдбрд▓ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд▓реБрдХрдЕрдк рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдХреНрд╡реЗрд░реАрд╕реЗрдЯ"ред

рдпрджрд┐ рдореЙрдбрд▓ = рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ред рдкреНрд░рд╛рдЗрдорд░реАрдХреЗрд░рд┐рд▓реЗрдЯреЗрдбрдлрд┐рд▓реНрдб (рдХреНрд╡реЗрд░реАрд╕реЗрдЯ = рдореЙрдбрд▓.рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕.рдСрд▓ ()) (рдореЙрдбрд▓рд╕реЗрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдо рдЗрд╕ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ), рддреЛ рд╕рднреА "рд╕рдВрдмрдВрдзрд┐рдд" рдСрдмреНрдЬреЗрдХреНрдЯ (рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд░реНрд╢рди рдХреНрд░рд┐рдпрд╛рдПрдВ (рдкреЛрд╕реНрдЯ, рдкреБрдЯ) рдореБрдЦреНрдп рдореЙрдбрд▓ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдЧреБрдг, рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ) "рдореЙрдбрд▓" рдлрд╝реАрд▓реНрдб (рд╡рд┐рдХрд▓реНрдк рд╡рд┐рдзрд┐) рдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред

рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред @ рдХреИрдирдХрди101 +1ред рд▓реЗрдХрд┐рди рди рдХреЗрд╡рд▓ "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛"ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдпрд╣ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рддрд░реНрдХ рдФрд░ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдорд┐рд╢реНрд░рдг, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХреЛрдВ рдореЗрдВ рдХреНрд╡реЗрд░реАрд╕реЗрдЯ рджреЗрдЦрддрд╛ рд╣реВрдВ: "serializers.PrimaryKeyRelatedField(queryset=".

рдмреЗрд╢рдХ, рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ:

рдХреНрд▓рд╛рд╕ рдореЙрдбрд▓рд╕реЗрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░:
рд╡рд░реНрдЧ рдореЗрдЯрд╛:
рдореЙрдбрд▓ = рдореЙрдбрд▓

рдХреНрдпреЛрдВрдХрд┐ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдореЙрдбрд▓ рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рдФрд░ рдХреМрди рд╕реЗ рдлрд╝реАрд▓реНрдб рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВред

рдлрд┐рд░ рднреА, рдореИрдВ рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рдерд╛ред

рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИ:

class BlogSerializer(serializers.ModelSerializer):

    entries = serializers.SerializerMethodField()

    class Meta:
        model = Blog

    def get_entries(self, obj):
        queryset = obj.entries.all()
        if 'request' in self.context:
            queryset = queryset.filter(author=self.context['request'].user)
        serializer = EntrySerializer(queryset, many=True, context=self.context)
        return serializer.data

@dustinfarris рдЬреЛ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝реАрд▓реНрдб рдмрдирд╛рддрд╛ рд╣реИ ... рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдПрдХ рдРрд╕реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдЬреЛ рдЗрд╕ рдзрд╛рдЧреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИред рдЬрдм рдПрдХ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдмреИрдХрдПрдВрдб (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдбреАрдЬреЗрдВрдЧреЛ рдлрд╝рд┐рд▓реНрдЯрд░) рд╕рдХреНрд╖рдо рд╣реЛрддрд╛ рд╣реИ рддреЛ рдмреНрд░рд╛рдЙрдЬрд╝ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдПрдкреАрдЖрдИ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ Filters рдмрдЯрди рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореИрдВ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдбреНрд░реЙрдкрдбрд╛рдЙрди рдлрд╝реАрд▓реНрдб рдкрд░ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рдХреНрд╡реЗрд░реАрд╕реЗрдЯ рдХрд╛ рд╕рдореНрдорд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдЗрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЙрджрд╛рд╣рд░рдг:

class Item(models.Model):
    project = models.ForeignKey(Project)

class ItemSerializer(serializers.ModelSerializer):
    def __init__(self, *args, **kwargs):
        request = kwargs.get('context', {}).get('request')
        self.fields['project'].queryset = request.user.project_set.all()
        super(ItemSerializer, self).__init__(*args, **kwargs)

рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг рдЖрдЗрдЯрдо рдХреЛ рдЬреЛрдбрд╝рдиреЗ/рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдлрд╝реЙрд░реНрдо рдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдбреНрд░реЙрдкрдбрд╛рдЙрди рдХреЛ рд╕рд╣реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рддрдХ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ рдЕрднреА рднреА Filters рдбреНрд░реЙрдкрдбрд╛рдЙрди рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред

рдиреЗрд▓рдЧрди рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ рд╕реЗ рдХрдИ рд╕рдВрдмрдВрдзреЛрдВ рдХреЗ рд▓рд┐рдПред рдЕрдм, рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдореЙрдбрд▓ рд╣реИ рдЬрд╣рд╛рдВ рдореЗрд░рд╛ рд░рд┐рд╢реНрддрд╛ рдПрдХ рдмрд╣реБрдд рд╕реЗ рдХрдИ рдлрд╝реАрд▓реНрдб рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдорд┐рдХреНрд╕рд┐рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдЗрдирдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП?

@fibbs рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝рдХрд░

            if isinstance(field, serializers.ManyRelatedField):
                method_name = 'filter_%s' % name
                try:
                    func = getattr(self, method_name)
                except AttributeError:
                    pass
                else:
                    field.child_relation.queryset = func(field.child_relation.queryset) 

рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдХрд┐рд╕реА рдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡рдЪреНрдЫ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдпреЛрдЧрджрд╛рди рджрд┐рдпрд╛ рдФрд░ рдпрд╣ рдЕрдм рдмрд┐рдирд╛ рдЗрдирд┐рдЯ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╣реИрдХ рдХрд┐рдП рд╕рдВрднрд╡ рд╣реИ: https://medium.com/django-rest-framework/limit-рд╕рдВрдмрдВрдзрд┐рдд- рдбреЗрдЯрд╛-choices-with-django-rest-framework-c54e96f5815e

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдпрд╣ рдзрд╛рдЧрд╛ рдЕрджреНрдпрддрди/рдмрдВрдж рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ?

рдХрд┐ рдХреЛрдИ рдореИрдВ рд╣реВрдВ;)
рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИ, рдореИрдВ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдБ рдХреНрдпреЛрдВрдХрд┐ #3605 рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдХреБрдЫ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
рдЕрдЧрд░ рдХреЛрдИ рдХреБрдЫ рд▓реЗрдХрд░ рдЖ рд╕рдХрддрд╛ рд╣реИ рддреЛ рд╣рдо рдЕрднреА рднреА рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдФрд░ рд╕реБрдзрд╛рд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред

рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП get_queryset() рд╡рд┐рдзрд┐ рдЕрдм рдореМрдЬреВрдж рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдиреЗрд╕реНрдЯреЗрдб рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреЗ рд▓рд┐рдП рднреА рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛!

рд╢рд╛рдпрджред рдЗрд╕рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? :)

рд╡рд╛рд╣ ... рдЕрджреНрднреБрдд, рдЕрдЧрд░ рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рд╕рд╣реА рджрд┐рд╢рд╛ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдореБрдЭреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдХрд╛рдлреА рд╕рдордп рд▓рдЧрд╛!

рд╕рдВрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдореЙрдбрд▓ рдирд╛рдо "рддреИрдирд╛рддреАEnvs" рдФрд░ "рд╣реЛрд╕реНрдЯ" рд╣реИрдВред
DeployedEnvs рдореЗрдВ рд╣реЛрд╕реНрдЯ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рджреЗрд╢реА рдХреБрдВрдЬреА рд╣реЛрддреА рд╣реИ (рдЕрд░реНрдерд╛рдд рдХрдИ рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рддEnvs рдПрдХ рд╣реА рд╣реЛрд╕реНрдЯ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рдореБрдЭреЗ рд╣реЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдкреАрдХреЗ рдХреЗ рдмрдЬрд╛рдп рд╣реЛрд╕реНрдЯ рдХреЗ fqdn рдлрд╝реАрд▓реНрдб рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА (рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕реНрд▓рдЧ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛ рдЬреЛ рдХрд┐ рдмрд╣реБрдд рдЖрд╕рд╛рди рдерд╛)ред FQDN рдлрд╝реАрд▓реНрдб рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ HOST рдХреЗ рд▓рд┐рдП FK рдорд╛рди рджреЗрдЦрдХрд░ рд╣реЛрд╕реНрдЯ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рддEnv рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ (POST) рдмрдирд╛рддреЗ рд╕рдордп рднреА рдореБрдЭреЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдЙрджрд╛рд╣рд░рдг: рдореИрдЪ host.fqdn рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рд╣реЛрд╕реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП PK рдХреЛ рджреЗрдЦрдХрд░ рдлрд╝реАрд▓реНрдб рд╣реЛрд╕реНрдЯ (рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛрд╕реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдорд┐рд▓рд╛рди fqdn рдкрд░ рд╕реЗрдЯ) рдХреЗ рд╕рд╛рде рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рддEnv рдмрдирд╛рдПрдВред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдореИрдВ рдбреНрд░реЙрдк рдбрд╛рдЙрди рдмрд╛рд░ рдореЗрдВ рд▓реМрдЯрд╛рдП рдЧрдП рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╡рд╛рд▓реА рд╣реЛрд╕реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ред

slugRelatedField рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдореЗрд░рд╛ рдлрд┐рдХреНрд╕ рдХреЛрдб рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

class UserHostsOnly(serializers.SlugRelatedField):
    def get_queryset(self):
        user = self.context['request'].user
        queryset = Host.objects.filter(owner=user)
        return queryset

class deployEnvSerializer(serializers.ModelSerializer):
    host = UserHostsOnly(slug_field='fqdn')

рдореИрдВ Django рдореЗрдВ рд▓рдЧрднрдЧ 5 рдХрд┐рддрд╛рдмреЗрдВ рд╣реВрдВ (рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдореИрдВ рдЙрди рд╕рднреА рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ), рдФрд░ рдХреЛрдИ рднреА рд╕рдВрджрд░реНрдн рдЧреНрд░рдВрде рдпрд╣ рдирд╣реАрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдХреНрд╖реЗрддреНрд░/рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред рдкрд╣рд▓реЗ рддреЛ рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдореИрдВ рдХреБрдЫ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБ, рд╣реИ рдирд╛? рдХреНрдпрд╛ рдореИрдВ рдЬреЛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЙрд╕реЗ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реИ? рдмреЗрдЭрд┐рдЭрдХ рдореБрдЭрд╕реЗ OOB рд╕рдВрдкрд░реНрдХ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рди рдХрд░реВрдВред рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рдж (рдПрдХ django рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╡рд╛рдХрдИ рдореБрд╢реНрдХрд┐рд▓ рдерд╛)ред

@рдПрд▓рд╕реАрд╕реНрдЯрд╛рдЗрд▓

DRF рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ Field ( Serializers рд╕рд╣рд┐рдд) рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдЕрдВрджрд░ рдФрд░ рдмрд╛рд╣рд░ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 2 рдореБрдЦреНрдп рддрд░реАрдХреЗ рд╣реИрдВ (рдпрд╛рдиреА JSON рдФрд░ рдкрд╛рдпрдерди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ):

  1. to_representation - рдбреЗрдЯрд╛ "рдмрд╛рд╣рд░" рдЬрд╛ рд░рд╣рд╛ рд╣реИ
  2. to_internal_value - рдбреЗрдЯрд╛ "рдЗрди" рдЖ рд░рд╣рд╛ рд╣реИ

рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдореЙрдбрд▓реЛрдВ рдХреА рдореЛрдЯреЗ рддреМрд░ рдкрд░ рд░реВрдкрд░реЗрдЦрд╛ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝реАрд▓реНрдб рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреА рдПрдХ рд░реВрдкрд░реЗрдЦрд╛ рдиреАрдЪреЗ рджреА рдЧрдИ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ SlugRelatedField рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ:

class UserHostsRelatedField(serializers.RelatedField):
    def get_queryset(self):
        # do any permission checks and filtering here
        return Host.objects.filter(user=self.context['request'].user)

    def to_representation(self, obj):
        # this is the data that "goes out"
        # convert a Python ORM object into a string value, that will in turn be shown in the JSON
        return str(obj.fqdn)

    def to_internal_value(self, data):
        # turn an INCOMING JSON value into a Python value, in this case a Django ORM object
        # lets say the value 'ADSF-1234'  comes into the serializer, you want to grab it from the ORM
        return self.get_queryset().get(fqdn=data)

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдк рдЖрдо рддреМрд░ рдкрд░ рд╕реБрд░рдХреНрд╖рд╛ рдЬреИрд╕реА рдЪреАрдЬрд╝реЛрдВ рдХреЗ рд▓рд┐рдП get_queryset рдпрд╛ to_internal_value рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдЪреЗрдХ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдпрджрд┐ django-guardian рдпрд╛ rules рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ

рдПрдХ рдФрд░ рдкреВрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ

from rest_framework.exceptions import (
    ValidationError,
    PermissionError,
)
class UserHostsRelatedField(serializers.RelatedField):
    def get_queryset(self):
        return Host.objects.filter(user=self.context['request'].user)

    def to_representation(self, obj):
        return str(obj.fqdn)

    def to_internal_value(self, data):
        if not isinstance(data, str):
            raise ValidationError({'error': 'Host fields must be strings, you passed in type %s' % type(data)})
        try:
            return self.get_queryset().get(fqdn=data)
        except Host.DoesNotExist:
            raise PermissionError({'error': 'You do not have access to this resource'})

рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ @cancan101 рдиреЗ рдЬреЛ рд▓рд┐рдЦрд╛ рдЙрд╕рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ:

рдПрдХ рдРрд╕реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдЬреЛ рдЗрд╕ рдзрд╛рдЧреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИред рдЬрдм рдПрдХ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдмреИрдХрдПрдВрдб (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдбреАрдЬреЗрдВрдЧреЛ рдлрд╝рд┐рд▓реНрдЯрд░) рд╕рдХреНрд╖рдо рд╣реЛрддрд╛ рд╣реИ рддреЛ рдмреНрд░рд╛рдЙрдЬрд╝ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдПрдкреАрдЖрдИ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░ рдмрдЯрди рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореИрдВ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдбреНрд░реЙрдкрдбрд╛рдЙрди рдлрд╝реАрд▓реНрдб рдкрд░ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рдХреНрд╡реЗрд░реАрд╕реЗрдЯ рдХрд╛ рд╕рдореНрдорд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдЗрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЬрд╣рд╛рдБ рддрдХ рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдБ рдпрд╣ рдЕрднреА рднреА рд╕рдЪ рд╣реИред рдбреЗрдЯрд╛ рд▓реАрдХ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝реЙрд░реЗрдирдХреА рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо Filterset рдлрд╝реАрд▓реНрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди @tomchristie рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ 'рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ' рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдореЙрдбрд▓рдЪреЙрдЗрд╕ рдХреЛ get_queryset рдкрджреНрдзрддрд┐ рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдореЗрдВ рдХрд╕реНрдЯрдо рдлрд╝реАрд▓реНрдб рдШреЛрд╖рдгрд╛ рдХреАред

рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдореИрдВ рдХрд╕реНрдЯрдо рдлрд╝рд┐рд▓реНрдЯрд░ рд╕реЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдиреАрдЪреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

рдирдореВрдирд╛ рд╡рд░реНрдХреЗрдВрдЯреНрд░реА рдореЙрдбрд▓:

class WorkEntry(models.Model):
   date = models.DateField(blank=False, null=True, default=date.today)
   who = models.ForeignKey(User, on_delete=models.CASCADE)
   ...

рдмреЗрд╕ рдореЙрдбрд▓ рд╡реНрдпреВ рд╕реЗрдЯ:

class WorkEntryViewSet(viewsets.ModelViewSet):
   queryset = WorkEntry.objects.all().order_by('-date')
   # only work entries that are owned by request.user are returned
   filter_backends = (OnlyShowWorkEntriesThatAreOwnedByRequestUserFilterBackend, ...)
   # 
   filter_fields = (
      # this shows a filter dropdown that contains User.objects.all() - data leakage!
      'who',
   )
   # Solution: this overrides filter_fields above
   filter_class = WorkentryFilter

рдХрд╕реНрдЯрдо рдлрд╝рд┐рд▓реНрдЯрд░рд╕реЗрдЯ (рдЖрдзрд╛рд░ рдореЙрдбрд▓ рдХреЗ рджреГрд╢реНрдп рд╕реЗрдЯ рдореЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░_рдХреНрд▓рд╛рд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ filter_fields рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реИ)

class WorkentryFilter(FilterSet):
    """
    This sets the available filters and filter types
    """
    # foreignkey fields need to be overridden otherwise the browseable API will show User.objects.all()
    # data leakage!
    who = ModelChoiceFilter(queryset=who_filter_function)

    class Meta:
        model = WorkEntry
        fields = {
            'who': ('exact',),
        }

рдпрд╣рд╛рдВ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХреНрд╡реЗрд░реАрд╕реЗрдЯ: http://django-filter.readthedocs.io/en/latest/ref/filters.html#modelchoicefilter

def who_filter_function(request):
    if request is None:
        return User.objects.none()
   # this solves the data leakage via the filter dropdown
   return User.objects.filter(pk=request.user.pk)

@macolo

рдЗрд╕ рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:

рдХреНрдпрд╛ рдпрд╣ рдЙрд╕ рдбреЗрдЯрд╛ рд░рд┐рд╕рд╛рд╡ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рдЬрд┐рд╕рдХрд╛ рдЖрдк рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдореЗрд░реЗ рдЦреЛрдЬ рдлрд╝реАрд▓реНрдб рдмреНрд░рд╛рдЙрдЬрд╝ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдПрдкреАрдЖрдИ рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдкрд░рд┐рдгрд╛рдо рдЕрднреА рднреА рд╕реНрд╡рд╛рдореА рджреНрд╡рд╛рд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдП рдЧрдП рдХреНрд╡реЗрд░реАрд╕реЗрдЯ рддрдХ рд╣реА рд╕реАрдорд┐рдд рд╣реИрдВред

class HostsViewSet(DefaultsMixin, viewsets.ModelViewSet):
    search_fields = ('hostname','fqdn')
    def get_queryset(self):
        owner = self.request.user
        queryset = Host.objects.filter(owner=owner)
        return queryset

@Lcstyle рдореИрдВ рдореЗрдЬрдмрд╛рдиреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдореИрдВ рд╕рдВрдмрдВрдзрд┐рдд рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореЗрдЬрдмрд╛рди рдХреЗ рдорд╛рд▓рд┐рдХ)

рдореИрдВ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рдореИрдВ рдЕрдкрдиреЗ рдЖрд░рдИрдПрд╕рдЯреА рдореЗрдВ рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ ... рдЖрдорддреМрд░ рдкрд░ рдЙрджрд╛рд╣рд░рдг request.user рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдореИрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдЬрдЯрд┐рд▓ рдорд╛рдорд▓рд╛ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдорд╛рди рд▓реЗрдВ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ Company рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ Employees рдФрд░ Company рдореЗрдВ рдорд╣реАрдиреЗ рдХреЗ рдХрд░реНрдордЪрд╛рд░реА рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ:

class Company(Model):
   employee_of_the_month = ForeignKey(Employee)
   ...

class Employee(Model):
    company = ForeignKey(Company)

рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрд░рдИрдПрд╕рдЯреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ employee_of_the_month рдХреЛ Employee рджреНрд╡рд╛рд░рд╛ рдЙрд╕реА company.id рд╕рд╛рде Company рд░реВрдк рдореЗрдВ рд╕реАрдорд┐рдд рдХрд░реЗред

рдореИрдВ рдЕрдм рддрдХ рдпрд╣реА рд▓реЗрдХрд░ рдЖрдпрд╛ рд╣реВрдВ,

class CompanySerializer(ModelSerializer):
   employee_of_the_month_id = PrimaryKeyRelatedField(
     source='employee_of_the_month',
     queryset=Employee.objects.all())

   def __init__(self, *args, **kwargs):                                        
        super(CompanySerializer, self).__init__(*args, **kwargs)              
        view = self.context.get('view', None)                                   
        company_id = None                                                     
        if view and isinstance(view, mixins.RetrieveModelMixin):                
            obj = view.get_object()                                             
            if isinstance(obj, Company):   #  We could get the model from the queryset.                                     
                company_id = obj.id                                           
        q = self.fields['employee_of_the_month_id'].queryset
        self.fields['employee_of_the_month_id'].queryset = q.filter(company_id=company_id)

... рдХреНрдпрд╛ рдпрд╣ рддрд░реАрдХрд╛ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕рд╛рд░рдЧрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдпрд╣ рдереЛрдбрд╝рд╛ рд╕рд╛ @nailgun рдХреЗ https://github.com/encode/django-rest-framework/issues/1985#issuecomment -61871134 рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ

рдореИрдВ рднреА рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдореИрдВ рдХрд░ рд╕рдХрддрд╛ рднреА validate() рдХрд┐ employee_of_the_month рд╕рдВрддреБрд╖реНрдЯ рдХреНрд╡реЗрд░реАрд╕рдореВрд╣ рдПрдХ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рджреНрд╡рд╛рд░рд╛ рдКрдкрд░ рдмрдирд╛рдпрд╛ get() рд╕рд╛рде рдХреНрд╡реЗрд░реАрд╕рдореВрд╣ рдХреЗ рдЦрд┐рд▓рд╛рдл employee_of_the_month.id

#3605 рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдХреЗ рд╕рд╛рде рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдЖрдЗрдП рдХрд░реНрдордЪрд╛рд░реА рдХреЗ рдорд╣реАрдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕реАрдИрдУ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

 class CEOField(serializers.PrimaryKeyRelatedField):                 

      def get_queryset(self):                                                     
          company_id = None                                                     
          view = self.context.get('view', None)                                   
          if view and isinstance(view, mixins.RetrieveModelMixin):                
              obj = view.get_object()                                             
              if isinstance(obj, Company):                                      
                  dashboard_id = obj.id                                           
          return Employee.objects.filter(company_id=company_id)           

рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЪрдпрди рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрдВрдкрдиреА рдХреЛ рдирд╣реАрдВ рджреЗрдЦ рд░рд╣реЗ рд╣реЛрдВред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдПрдХ рдирдИ рдХрдВрдкрдиреА рдореЗрдВ рддрдм рддрдХ рд╕реАрдИрдУ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рдЬрдм рддрдХ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдХрд░реНрдордЪрд╛рд░реА рди рд╣реЛрдВ, рдЬреЛ рдХрд┐ рдХрдВрдкрдиреА рдмрдирдиреЗ рддрдХ рдЖрдкрдХреЗ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреАред

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдПрдХрдорд╛рддреНрд░ рдЦреЗрдж рдпрд╣ рд╣реИ рдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдбреНрд░рд╛рдпрд░/рдЬреЗрдиреЗрд░рд┐рдХ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

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

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

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

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

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

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