Django-filter: ArrayField ํ•„ํ„ฐ๋ง

์— ๋งŒ๋“  2016๋…„ 08์›” 24์ผ  ยท  4์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: carltongibson/django-filter

django.contrib.postgres.fields ์™€ ๊ฐ™์ด ArrayField django.contrib.postgres.fields ์ •์˜๋œ ํ•„๋“œ๋ฅผ ํ•„ํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

django-filter์—๋Š” ํ˜„์žฌ postgres ๊ธฐ์—ฌ ํ•„๋“œ์™€ ํ˜ธํ™˜๋˜๋Š” ํ•„ํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ง์ ‘ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์— ๋”ฐ๋ผ ๋‹ค์†Œ ์–ด๋ ค์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ArrayField ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ์กฐํšŒ ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

class CharArrayFilter(filters.BaseCSVFilter, filters.CharFilter):
     pass

class MyFilterSet(filters.FilterSet):
    tags__contains = CharArrayFilter(name='tags', lookup_expr='contains')

    class Meta:
        model = SomethingTaggable
GET http://localhost/api/something-taggable?tags__contains=a,b,c

์œ„์˜ ํ•„ํ„ฐ๋Š” ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ์ž…๋ ฅ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๊ณ  ๊ธฐ๋ณธ .filter() ํ˜ธ์ถœ์— ์ ํ•ฉํ•œ ์ •๋ฆฌ๋œ ๊ฐ’ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด, ๋น„๊ตฌ์กฐ์ ์ด๋ฉฐ ์ด๋ก ์ ์œผ๋กœ ๋ฌดํ•œํ•œ ์กฐํ•ฉ์„ ๊ฐ–๋Š” ์ธ๋ฑ์Šค ๋ฐ ์Šฌ๋ผ์ด์Šค ๋ณ€ํ™˜์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์กฐ๊ธˆ ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  4 ๋Œ“๊ธ€

django-filter์—๋Š” ํ˜„์žฌ postgres ๊ธฐ์—ฌ ํ•„๋“œ์™€ ํ˜ธํ™˜๋˜๋Š” ํ•„ํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ง์ ‘ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์— ๋”ฐ๋ผ ๋‹ค์†Œ ์–ด๋ ค์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ArrayField ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ์กฐํšŒ ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

class CharArrayFilter(filters.BaseCSVFilter, filters.CharFilter):
     pass

class MyFilterSet(filters.FilterSet):
    tags__contains = CharArrayFilter(name='tags', lookup_expr='contains')

    class Meta:
        model = SomethingTaggable
GET http://localhost/api/something-taggable?tags__contains=a,b,c

์œ„์˜ ํ•„ํ„ฐ๋Š” ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ์ž…๋ ฅ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๊ณ  ๊ธฐ๋ณธ .filter() ํ˜ธ์ถœ์— ์ ํ•ฉํ•œ ์ •๋ฆฌ๋œ ๊ฐ’ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด, ๋น„๊ตฌ์กฐ์ ์ด๋ฉฐ ์ด๋ก ์ ์œผ๋กœ ๋ฌดํ•œํ•œ ์กฐํ•ฉ์„ ๊ฐ–๋Š” ์ธ๋ฑ์Šค ๋ฐ ์Šฌ๋ผ์ด์Šค ๋ณ€ํ™˜์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์กฐ๊ธˆ ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.

์ •๋ณด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋‹น๋ถ„๊ฐ„์€ Out of Scope๋กœ ์ข…๋ฃŒํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œํ™”๋˜๊ณ  ํ…Œ์ŠคํŠธ๋œ pull ์š”์ฒญ์„ ๊ณ ๋ คํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ฏธ๋ž˜์— ์žฌ๊ณ ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ:
name ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์ด field_name ๋˜์—ˆ์œผ๋ฏ€๋กœ MyFilterSet ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

class MyFilterSet(filters.FilterSet):
    tags__contains = CharArrayFilter(field_name='tags', lookup_expr='contains')

    class Meta:
        model = SomethingTaggable
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰