μ λͺ©μ΄ λ€μ μμν μ μμ΅λλ€. 쿼리 μΈνΈκ° κ²μλκ³ νλμ λν νν°λ§μ΄ μ μ©λ λλ§λ€ νΈμΆλλ μΌλ° filter
λ©μλκ° μμΌλ©΄ μ’μ κ²μ
λλ€. μ, qs
μμ±μ μ¬μ μνκ³ λ¨Όμ νν°λ§λ 쿼리 μΈνΈλ₯Ό κ°μ Έμ¨ λ€μ ν리νμΉλ₯Ό μ μ©ν μ μμ΅λλ€. κ·Έλ¬λ _μ΄κ²μ΄ λΆμμ©μ΄ μμ μ μκ³ νν°μ μ λ¬λ λ°μ΄ν°κ° μ‘μΈμ€νκΈ°μ μμ νμ§ μ¬λΆλ νμ€νμ§ μμ΅λλ€._
μ μ¬μ© μ¬λ‘κ° μμ΅λλ€.
queryset.filter(items__field="foo")
μμμ κ°μ΄ M2M κ΄κ³λ‘ 쿼리 μΈνΈλ₯Ό νν°λ§νκ³ μμ΅λλ€. κ·Έλ¬λ ν΄λΉ νλλ‘ νν°λ§λ 미리 κ°μ Έμ¨ νλͺ©λ κ°μ Έμ€κ³ μΆμ΅λλ€.
μ¦, λ΄ νν°λ λ€μκ³Ό κ°μ΅λλ€.
# 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
κ° ν리νμΉλμ§ μμΌλ©΄(쿼리μ
λ³΄νΈ μμ±μ κ²μ¬νκΈ° λλ¬Έμ λμ μ ) νμ νν°λ§κ³Ό ν¨κ» ν리νμΉλ₯Ό μ μ©ν©λλ€. κ·Έλ¬λ μ΄μ κ°μ μν©μ λμ²νλ λ λμ λ°©λ²μ΄ μμ΄μΌ ν©λλ€.
λ΄ μκ° μΆ©λΆν λͺ ννκΈ°λ₯Ό λ°λλλ€.
μλ
νμΈμ @Alexx-Gμ
λλ€. νν° μΈνΈμ κ΄λ ¨ νν° ν΄λμ€ κ°μ μ‘°μ μΌλ‘ μ΄κ²μ΄ κ°λ₯ν μ μλ€κ³ μκ°ν©λλ€. κΈ°λ³Έμ μΌλ‘ νν°λ Prefetch
μΈμ€ν΄μ€λ₯Ό parent
νν° μΈνΈμ μΆκ°ν©λλ€. FilterSet.qs
λ μ μ ν κ²½μ° prefetch_related
λ₯Ό νΈμΆν©λλ€.
μ¦, μ΄κ²μ μ¬μ© μ¬λ‘λ 무μμ λκΉ? ν리νμΉμ μ²λ¦¬νκΈ°μ λ μ μ ν μ₯μκ° μλ€κ³ μ£Όμ₯ν©λλ€.
νν° μΈνΈμ κ΄λ ¨ νν° ν΄λμ€ κ°μ μ‘°μ μΌλ‘ μ΄κ²μ΄ κ°λ₯ν μ μλ€κ³ μκ°ν©λλ€.
qs
μμ±μ μ¬μ μνμ¬ μ΄λ―Έ λ΄ λ¬Έμ λ₯Ό ν΄κ²°νμ§λ§ λ€μ λͺ
ννμ§ μκ³ λ¬Έμνλμ§ μμμ΅λλ€. μ¦, κΈ°λ³Έ ν΄λμ€μ μΌλΆ λ΄λΆ λ³κ²½ μ¬νμ΄ λ΄ νν° μΈνΈμ μν₯μ λ―ΈμΉμ§ μμ κ²μ΄λΌκ³ νμ ν μ μμ΅λλ€.
μ¦, μ΄κ²μ μ¬μ© μ¬λ‘λ 무μμ λκΉ? ν리νμΉμ μ²λ¦¬νκΈ°μ λ μ μ ν μ₯μκ° μλ€κ³ μ£Όμ₯ν©λλ€.
λλ μμμ λ΄ μ¬μ© μ¬λ‘λ₯Ό μ€λͺ νλ€κ³ μκ°ν©λλ€. ν리νμΉλ νν°μ μμ‘΄νκΈ° λλ¬Έμ νν°λ§κ³Ό ν리νμΉμ λΆλ¦¬νλ κ²μ μλ―Έκ° μμ΅λλ€. κ·Έλ¦¬κ³ κ·Έκ²λ€μ λΆλ¦¬νλ©΄ νν°μ λν΄ λμΌν κ²μ¬λ₯Ό 볡μ ν΄μΌ ν©λλ€.
μ¦, qs μμ±μ κ³΅κ° κ³μ½μ λν μ€λͺ μ΄λ μ΄μ λν λ¬Έμνλ νν¬κ° μλ κ²½μ° νν° μΈνΈμ μ¬μ©μ μ μκ° ν₯μλ©λλ€.
μλ νμΈμ @Alexx-Gμ λλ€. 2.0 릴리μ€λ μμ§ ν΄κ²° λ°©λ²μ΄ μμ§λ§ μ΄ μ§λ¬Έμ ꡬ체μ μΌλ‘ ν΄κ²°νκΈ° μν΄ APIμ λͺ κ°μ§ λ³κ²½ μ¬νμ΄ μμ κ²μ λλ€. μ컨λ,
.filter_queryset()
λ©μλλ₯Ό μ¬μ μνκ³ μΆμ κ²μ
λλ€. .qs
μμ±μ κΈ°λ³Έμ μΌλ‘ .filter_queryset()
νΈμΆ λ° κ²°κ³Ό μΊμ±μ λ΄λΉν©λλ€.self.form.cleaned_data
μμ ν리νμΉμ© νν° κ°μ μ»μ μ μμ΅λλ€.λ Έλ ₯ν΄ μ£Όμ μ κ°μ¬ν©λλ€!
κ°μ₯ μ μ©ν λκΈ
μλ νμΈμ @Alexx-Gμ λλ€. 2.0 릴리μ€λ μμ§ ν΄κ²° λ°©λ²μ΄ μμ§λ§ μ΄ μ§λ¬Έμ ꡬ체μ μΌλ‘ ν΄κ²°νκΈ° μν΄ APIμ λͺ κ°μ§ λ³κ²½ μ¬νμ΄ μμ κ²μ λλ€. μ컨λ,
.filter_queryset()
λ©μλλ₯Ό μ¬μ μνκ³ μΆμ κ²μ λλ€..qs
μμ±μ κΈ°λ³Έμ μΌλ‘.filter_queryset()
νΈμΆ λ° κ²°κ³Ό μΊμ±μ λ΄λΉν©λλ€.self.form.cleaned_data
μμ ν리νμΉμ© νν° κ°μ μ»μ μ μμ΅λλ€.