Django-filter: CharFilter(widget=CSVWidget)λŠ” 더 이상 1.xμ—μ„œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2017λ…„ 05μ›” 24일  Β·  3μ½”λ©˜νŠΈ  Β·  좜처: carltongibson/django-filter

1.x 이전에 CharFilter와 ν•¨κ»˜ CSVWidget을 μ‚¬μš©ν•˜κ³  μžˆμ—ˆμ§€λ§Œ μ—…κ·Έλ ˆμ΄λ“œ 쀑이며 ν•΄λ‹Ή 쑰합이 더 이상 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ¬΄μ—‡μœΌλ‘œ μ „ν™˜ν•΄μ•Ό ν•˜λŠ”μ§€μ— λŒ€ν•œ λ¬Έμ„œλ‚˜ ꢌμž₯ 사항을 찾을 수 μ—†μŠ΅λ‹ˆλ‹€. μ‰Όν‘œλ‘œ κ΅¬λΆ„λœ 단일 κ°’ λ˜λŠ” μ—¬λŸ¬ 값을 μˆ˜λ½ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

CSVWidget λŠ” κ°’ λͺ©λ‘μ„ μ˜¬λ°”λ₯΄κ²Œ λ°˜ν™˜ν•˜μ§€λ§Œ CharField.clean() λŠ” λͺ©λ‘μ„ λ‹€μ‹œ ν…μŠ€νŠΈ κ°’μœΌλ‘œ κ°•μ œ λ³€ν™˜ν•˜λ―€λ‘œ "['1', '2', '3']" μž…λ‹ˆλ‹€. CSVWidget λ₯Ό 필터에 μ „λ‹¬ν•˜λŠ” κ²ƒλ§ŒμœΌλ‘œλŠ” μΆ©λΆ„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ°’ λͺ©λ‘μ„ ν—ˆμš©ν•˜λ €λ©΄ 양식 ν•„λ“œλ₯Ό μž¬μ •μ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ˜¬λ°”λ₯Έ ν•„λ“œ λ™μž‘μ„ μ–»λŠ” κ°€μž₯ μ‰¬μš΄ 방법은 BaseCSVFilter ν˜Όν•©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. κ°’ λͺ©λ‘μ„ ν—ˆμš©ν•˜λŠ” 양식 ν•„λ“œλ₯Ό μ˜¬λ°”λ₯΄κ²Œ κ΅¬μ„±ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

λͺ¨λ“  3 λŒ“κΈ€

λ‹€μŒκ³Ό 같이 μ‹œλ„ν•΄ λ³΄μ„Έμš”.

class CharInFilter(django_filters.BaseInFilter, django_filters.CharFilter):
     pass

λ‚˜λŠ”μ΄ λ¬Έμ œμ— μ§λ©΄ν•˜λŠ” 데 μ‹œκ°„μ„ λ³΄λƒˆκ³  @carltongibson μ†”λ£¨μ…˜μ΄ ν™•μ‹€νžˆ λͺ‡ 가지 λ¬Έμ œμ— 도움이 λœλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

λ‚˜λŠ” λ‹€μŒκ³Ό κ°™μ΄ν•˜λ €κ³ ν–ˆμŠ΅λ‹ˆλ‹€.

class TestListFilter(Filter):
    field_class = forms.CharField

    def filter(self, qs, value):
        actual_filter = fields.Lookup(value, 'in')
        from pprint import pprint
        pprint(value)
        pprint(actual_filter)
        return qs

class BaseModelFilter(filters.FilterSet):
    id__in = TestListFilter(name='id', lookup_expr='in', widget=widgets.CSVWidget)

DRF 및 URL μ‚¬μš©: ?id__in=a,b,c

κ·ΈλŸ¬λ‚˜ widget=widgets.CSVWidget μ‚¬μš©ν•˜λŠ” κ²ƒμ²˜λŸΌ μ‹€μ œλ‘œ λͺ©λ‘μ„ μ–΄λ–»κ²Œλ“  λ¬Έμžμ—΄λ‘œ μΊμŠ€νŒ…ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆκΉŒ?

ν•„ν„° 값을 μΈμ‡„ν•˜λ©΄ "['a', 'b', 'c']"
real_filter에도 λ”°μ˜΄ν‘œκ°€ μžˆμŠ΅λ‹ˆλ‹€.
Lookup(value="['a', 'b', 'c']", lookup_type='in')

제곡된 ꢌμž₯ 사항에 따라 λ‹€μŒκ³Ό 같이 μ „ν™˜ν•©λ‹ˆλ‹€.

class UUIDInFilter(filters.BaseInFilter, filters.UUIDFilter):
    pass

class BaseModelFilter(filters.FilterSet):
    id = UUIDInFilter(name='id', lookup_expr='in')

그런 λ‹€μŒ ?id=3e543ed4-9b90-403d-8f40-048297a9ac31,6bf953eb-3ac3-4ea1-8ce5-9f84dd392246 λ₯Ό μ‚¬μš©ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

μ˜ˆμƒ κ²°κ³Όλ₯Ό μ–»κΈ° μœ„ν•΄.

"λ¬Έμžμ—΄λ‘œ λ‚˜μ—΄"은 μΌμ’…μ˜ 버그 λ˜λŠ” μ΅œμ†Œν•œ 일뢀 λ¬Έμ„œ λ³€κ²½ μ‚¬ν•­μ²˜λŸΌ λ³΄μž…λ‹ˆκΉŒ? κΈ°λ³Έ κΈ°λŠ₯이 μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€ 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. μ•„λ§ˆλ„ 그것은 단지 μ‚¬μš© 였λ₯˜ 일 κ²ƒμž…λ‹ˆλ‹€ =)

CSVWidget λŠ” κ°’ λͺ©λ‘μ„ μ˜¬λ°”λ₯΄κ²Œ λ°˜ν™˜ν•˜μ§€λ§Œ CharField.clean() λŠ” λͺ©λ‘μ„ λ‹€μ‹œ ν…μŠ€νŠΈ κ°’μœΌλ‘œ κ°•μ œ λ³€ν™˜ν•˜λ―€λ‘œ "['1', '2', '3']" μž…λ‹ˆλ‹€. CSVWidget λ₯Ό 필터에 μ „λ‹¬ν•˜λŠ” κ²ƒλ§ŒμœΌλ‘œλŠ” μΆ©λΆ„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ°’ λͺ©λ‘μ„ ν—ˆμš©ν•˜λ €λ©΄ 양식 ν•„λ“œλ₯Ό μž¬μ •μ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ˜¬λ°”λ₯Έ ν•„λ“œ λ™μž‘μ„ μ–»λŠ” κ°€μž₯ μ‰¬μš΄ 방법은 BaseCSVFilter ν˜Όν•©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. κ°’ λͺ©λ‘μ„ ν—ˆμš©ν•˜λŠ” 양식 ν•„λ“œλ₯Ό μ˜¬λ°”λ₯΄κ²Œ κ΅¬μ„±ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰