DRF рдФрд░ DjangoFilterBackend
рд╕рдХреНрд╖рдо рдХреЗ рд╕рд╛рде CoreAPI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреНрд╡реЗрд░реА рдкреИрд░рд╛рдо рдореЗрдВ рднреА рдПрдХ рдмрдирд╛рдиреЗ, рдЕрдкрдбреЗрдЯ рдпрд╛ рдЖрдВрд╢рд┐рдХ_рдЕрдкрдбреЗрдЯ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рдлрд╝реАрд▓реНрдб рдХреЛ рдореИрдк рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рд╣рдХ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИред
рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрдиреБрд░реЛрдз рд╣реИ рдЬреЛ рдПрдХ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдкреБрд╕реНрддрдХ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдирд╛рдо рднреА рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рдкрд░ рдПрдХ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдлрд╝реАрд▓реНрдб рд╣реИ:
# book views
class BookViewSet():
filter_fields = ('name',)
# ...
// schema
client.action('book', 'create', { 'name': 'My Awesome Book' });
рдпрд╣ URL рдкрд░рдо рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рдореЗрдВ рджреЛрдиреЛрдВ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдиреБрд░реЛрдз рдмрдирд╛рдПрдЧрд╛ред рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рд╣реИред
POST /api/book?name=My%20Awesome%20Book
name=My Awesome Book
рд╣рдордиреЗ рдЕрдкрдиреЗ рдбреАрдЖрд░рдПрдл рдлрд╝рд┐рд▓реНрдЯрд░ рдмреИрдХрдПрдВрдб рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╕реНрдЯрдо рдУрд╡рд░рд░рд╛рдЗрдб рдкрд░ рдЗрдВрдЧрд┐рдд рдХрд░рдХреЗ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдХреЛрдб рдореЗрдВ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ рд╣реИ:
class OnlyFilterOnReadDjangoFilterBackend(DjangoFilterBackend):
""" A filter backend that only allows for filtering by properties on
actions deemed as safe. This means that create, update, and partial_update
actions will not provide filter options.
"""
SAFE_ACTIONS = ('list', 'retrieve')
def get_schema_fields(self, view):
if view.action in self.SAFE_ACTIONS:
return super().get_schema_fields(view)
return []
рд╣рд╛рдп @Sonictherocketmanред рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдПрдХ рдмрдЧ рд╣реИ - рдпрд╣ рдЕрдиреБрд░реЛрдз рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп рдХреНрд╡реЗрд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рдХреЗ рдмреАрдЪ рдЙрдкрдпреБрдХреНрдд рд░реВрдк рд╕реЗ рдЕрдВрддрд░ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХреЗрд╡рд▓ рдЧреИрд░-рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рд╕рд╣реА рдирд╣реАрдВ рд╣реИред рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рддрдм рд╣реЛрддреА рд╣реИ рдЬрдм рдЖрдзрд╛рд░ рдХреНрд╡реЗрд░реАрд╕реЗрдЯ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдЬрд┐рд╕рдХреЗ рд╡рд┐рд░реБрджреНрдз рдПрдХ рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдореИрдВ рдЗрд╕реЗ рдЕрднреА рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛, рдмрд╕ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдПред
рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдореБрджреНрджрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреНрд░рд┐рдпрд╛рдПрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рдкреНрд░рд╢реНрдиреЛрдВ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд╕рд╛рдзрди рдХреЛ рд▓рд┐рдЦрдирд╛) рдкрд░ рдХреЛрдИ рд╕рдордЭ рдирд╣реАрдВ рд▓реЗрддреА рд╣реИрдВ рдФрд░ рд╕реНрдХреАрдорд╛ рдХреЛ рдЖрдИрдПрдордУ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдпрджрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рддреНрд╡рд░рд┐рдд рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдФрд░ рдЗрд╕ рдкрд░ рдЖрдкрдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреНрдпрд╛ рд╣реИрдВ, рдЗрд╕рдореЗрдВ рдореБрдЭреЗ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИред
рдХрдореЛрдмреЗрд╢, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рддрдХрдиреАрдХ рд╕реЗ рдмрд╛рд╣рд░ _automagic_ рдХреЛрдб рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЗрдЪреНрдЫрд╛рдУрдВ рд╕реЗ рдпрд╣рд╛рдВ рд╕реАрдорд┐рдд рд╣реИрдВ (рдЗрд╕рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ)ред
рд╕реНрдХреАрдорд╛ (рдХрд┐рд╕реА рднреА рдЙрдкрд▓рдмреНрдз рдкреНрд░рд╛рд░реВрдк рдореЗрдВ) рдХреЗ рд╕рд╛рде рд╣рдо (рдЕрднреА рддрдХ) рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, CoreAPI рдХреЗ рд╕рд╛рде, рд╣рдо рдЕрднреА рддрдХ рдПрдХ рддрд┐рдерд┐ рд╕реАрдорд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдПрдХ рд╕рд╛рде рд╕рдореВрд╣рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИрдВ рдХрд┐ рд╡реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред (рд╣рдо рд╣рд╛рде рд╕реЗ рд╕реНрдХреАрдорд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЛрдИ рднреА рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред)
рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЬреИрд╕реЗ рд╣реА рдпрд╣ рдЯреВрд▓рд┐рдВрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕реБрдзрд░ рдЬрд╛рдПрдЧрд╛ред
рдХрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖ рдкрдВрдХреНрддрд┐:
client.action('book', 'create', { 'name': 'My Awesome Book' });
рдХреНрд╡реЗрд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдореВрд░реНрдд рд▓реАрдХрд┐рдВрдЧ рд╣реИред рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХреЛ _by-hand_ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдХреНрд╡реЗрд░реА рдкреИрд░рд╛ рдФрд░ рдмреЙрдбреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ред
рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдпрд╣рд╛рдВ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдзрдиреНрдпрд╡рд╛рджред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рд╣рд╛рдп @Sonictherocketmanред рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдПрдХ рдмрдЧ рд╣реИ - рдпрд╣ рдЕрдиреБрд░реЛрдз рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп рдХреНрд╡реЗрд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рдХреЗ рдмреАрдЪ рдЙрдкрдпреБрдХреНрдд рд░реВрдк рд╕реЗ рдЕрдВрддрд░ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХреЗрд╡рд▓ рдЧреИрд░-рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рд╕рд╣реА рдирд╣реАрдВ рд╣реИред рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рддрдм рд╣реЛрддреА рд╣реИ рдЬрдм рдЖрдзрд╛рд░ рдХреНрд╡реЗрд░реАрд╕реЗрдЯ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдЬрд┐рд╕рдХреЗ рд╡рд┐рд░реБрджреНрдз рдПрдХ рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдореИрдВ рдЗрд╕реЗ рдЕрднреА рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛, рдмрд╕ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдПред