рд╢реАрд░реНрд╖рдХ рдереЛрдбрд╝рд╛ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рд╕рд╛рдорд╛рдиреНрдп filter
рд╡рд┐рдзрд┐ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕реЗ рд╣рд░ рдмрд╛рд░ рдХреНрд╡реЗрд░реАрд╕реЗрдЯ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рд▓рд╛рдЧреВ рдХреА рдЬрд╛рддреА рд╣реИред рд╣рд╛рдБ, рдореИрдВ qs
рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдкрд╣рд▓реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдП рдЧрдП рдХреНрд╡реЗрд░реАрд╕реЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рдкреНрд░реАрдлреЗрдЪ рд▓рд╛рдЧреВ рдХрд░реЗрдВред рд▓реЗрдХрд┐рди _рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕рдХреЗ рдХреБрдЫ рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред_
рдореЗрд░рд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рд╣реИред
рдореИрдВ рдПрдХ M2M рд╕рдВрдмрдВрдз рджреНрд╡рд╛рд░рд╛ рдПрдХ рдХреНрд╡реЗрд░реАрд╕реЗрдЯ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рдЬреИрд╕рд╛ рдХрд┐ queryset.filter(items__field="foo")
)ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЙрд╕ рдХреНрд╖реЗрддреНрд░ рджреНрд╡рд╛рд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдП рдЧрдП рдкреНрд░реАрдлреЗрдЪ рдХрд┐рдП рдЧрдП рдЖрдЗрдЯрдо рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдореЗрд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
# In my filterset
def filter_items_by_field(self, queryset, name, value):
queryset = queryset.all().filter(
items__field=value,
)
prefetched_items = Prefetch(
'items',
Item.objects..filter(
field=value,
),
)
return queryset.prefetch_related(prefetched_items)
# In my vieset
def get_queryset(self):
queryset = super().get_queryset()
# This should be applied everytime
prefetched_items = Prefetch(
'items',
Item.objects..filter(
another_field=some_value,
),
)
return queryset.prefetch_related(prefetched_items)
рдЗрд╕ рддрд░рд╣ рдПрдХ рдПрдХрд▓ рдлрд╝рд┐рд▓реНрдЯрд░ рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореЗрд░реЗ рдкрд╛рд╕ рдХрдИ filter_items_by_*
рдлрд╝рд┐рд▓реНрдЯрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ + рдореБрдЭреЗ рд╕рднреА рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рд▓рд┐рдП рдкреНрд░реАрдлрд╝реЗрдЪ рд╕реЗ рдХреНрд╡реЗрд░реАрд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рдПрдХрд╛рдзрд┐рдХ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкрд░рд╕реНрдкрд░ рдЕрдирдиреНрдп рд╣реИрдВред рд▓реЗрдХрд┐рди рдПрдХ рдлрд┐рд▓реНрдЯрд░ + рдЬреЗрдиреЗрд░рд┐рдХ рдЕрдкрд╡рд╛рдж рдХрд╛ рдХрд╛рд░рдг рдмрдиреЗрдЧрд╛ред
рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рд╣реА рд▓реБрдХрдЕрдк рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░реАрдлреЗрдЪ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рддреЛ, рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореБрдЭреЗ рдмрд╕ рдПрдХ рдЕрдкрд╡рд╛рдж рдорд┐рд▓реЗрдЧрд╛ред
рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╕рдорд╛рдзрд╛рди рд╣реИ: рд╕рднреА filter_items_by_*
рдкреНрд░реАрдлрд╝реЗрдЪ рдкрд░ рдЕрдирд┐рд╡рд╛рд░реНрдп рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХрд░рддрд╛ рд╣реИред
рдФрд░ filter_queryset
(рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж) рдореЗрдВ, рдпрджрд┐ items
рдкреНрд░реАрдлрд╝реЗрдЪ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдХреНрдпрд╛ рдмреБрд░рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдХреНрд╡реЗрд░реАрд╕реЗрдЯ рдкреНрд░реЛрдЯреЗрдХреНрдЯреЗрдб attrs рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣рд╛ рд╣реВрдБ), рдореИрдВ рдЕрдирд┐рд╡рд╛рд░реНрдп рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдкреНрд░реАрдлрд╝реЗрдЪ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реВрдБред рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рдПрдХ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдХрд╛рдлреА рд╕реНрдкрд╖реНрдЯ рд╣реИред
рд╣рд╛рдп @ рдПрд▓реЗрдХреНрд╕-рдЬреАред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлрд╝рд┐рд▓реНрдЯрд░рд╕реЗрдЯ рдФрд░ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдмреАрдЪ рдХреБрдЫ рд╕рдордиреНрд╡рдп рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рдлрд╝рд┐рд▓реНрдЯрд░ рдЕрдкрдиреЗ parent
рдлрд╝рд┐рд▓реНрдЯрд░рд╕реЗрдЯ рдореЗрдВ рдПрдХ Prefetch
рдЙрджрд╛рд╣рд░рдг рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред FilterSet.qs
рддрдм рдЙрдкрдпреБрдХреНрдд рд╣реЛрдиреЗ рдкрд░ рдмрд╕ prefetch_related
рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред
рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдХреНрдпрд╛ рд╣реИ? рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдкреНрд░реАрдлрд╝реЗрдЪрд┐рдВрдЧ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╕реНрдерд╛рди рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлрд╝рд┐рд▓реНрдЯрд░рд╕реЗрдЯ рдФрд░ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдмреАрдЪ рдХреБрдЫ рд╕рдордиреНрд╡рдп рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА qs
рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдХреЗ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░ рд▓реА рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╕реЗ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣ рдкреНрд░рд▓реЗрдЦрд┐рдд рдирд╣реАрдВ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХрд┐ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдХреБрдЫ рдЖрдВрддрд░рд┐рдХ рдкрд░рд┐рд╡рд░реНрддрди рдореЗрд░реЗ рдлрд╝рд┐рд▓реНрдЯрд░рд╕реЗрдЯ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ (рдареАрдХ рд╣реИ, рдореИрдВрдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд┐рди рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реИрд╕реЗ рднреА ..)
рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдХреНрдпрд╛ рд╣реИ? рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдкреНрд░реАрдлрд╝реЗрдЪрд┐рдВрдЧ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╕реНрдерд╛рди рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред
рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдФрд░ рдкреНрд░реАрдлрд╝реЗрдЪрд┐рдВрдЧ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░реАрдлрд╝реЗрдЪрд┐рдВрдЧ рдлрд╝рд┐рд▓реНрдЯрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рдФрд░ рдЕрдЧрд░ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдлрд┐рд▓реНрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдЪреЗрдХ рдХреА рдирдХрд▓ рдХрд░рдиреА рд╣реЛрдЧреАред
рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрджрд┐ qs рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЕрдиреБрдмрдВрдз рдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реБрдХ рдХрд╛ рд╡рд┐рд╡рд░рдг рдерд╛, рддреЛ рдЗрд╕рд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рд╕реЗрдЯ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛрдЧрд╛ред
рд╣рд╛рдп @ рдПрд▓реЗрдХреНрд╕-рдЬреАред 2.0 рд░рд┐рд▓реАрдЬ рдЕрднреА рднреА рдПрдХ рд░рд╛рд╕реНрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдкреАрдЖрдИ рдореЗрдВ рдХреБрдЫ рдмрджрд▓рд╛рд╡ рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕ рдкреНрд░рд╢реНрди рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ,
.filter_queryset()
рдкрджреНрдзрддрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред .qs
рд╡рд┐рд╢реЗрд╖рддрд╛ рдореВрд▓ рд░реВрдк рд╕реЗ .filter_queryset()
рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдФрд░ рдЙрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдХреИрд╢рд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧреАредself.form.cleaned_data
рд╕реЗ рдкреНрд░реАрдлрд╝реЗрдЪрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдлрд╝рд┐рд▓реНрдЯрд░ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредрдЖрдкрдХреЗ рдкреНрд░рдпрд╛рд╕ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рд╣рд╛рдп @ рдПрд▓реЗрдХреНрд╕-рдЬреАред 2.0 рд░рд┐рд▓реАрдЬ рдЕрднреА рднреА рдПрдХ рд░рд╛рд╕реНрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдкреАрдЖрдИ рдореЗрдВ рдХреБрдЫ рдмрджрд▓рд╛рд╡ рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕ рдкреНрд░рд╢реНрди рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ,
.filter_queryset()
рдкрджреНрдзрддрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред.qs
рд╡рд┐рд╢реЗрд╖рддрд╛ рдореВрд▓ рд░реВрдк рд╕реЗ.filter_queryset()
рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдФрд░ рдЙрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдХреИрд╢рд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧреАредself.form.cleaned_data
рд╕реЗ рдкреНрд░реАрдлрд╝реЗрдЪрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдлрд╝рд┐рд▓реНрдЯрд░ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред