Django-filter: ํ•„ํ„ฐ ํ•„๋“œ๋Š” ๊ธฐ์ˆ ์ ์œผ๋กœ ๋ชจ๋“  DRF ๋ณด๊ธฐ ์ž‘์—…์— ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ CoreAPI ์Šคํ‚ค๋งˆ๋ฅผ ์—‰๋ง์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2018๋…„ 05์›” 16์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: carltongibson/django-filter

DRF ๋ฐ DjangoFilterBackend ๊ฐ€ ํ™œ์„ฑํ™”๋œ CoreAPI๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ๋Š” ์ƒ์„ฑ, ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๋ถ€๋ถ„_์—…๋ฐ์ดํŠธ ์ž‘์—…์— ๋Œ€ํ•œ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜์—๋„ ๋งคํ•‘ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ

์ด๋ฆ„์ด ์žˆ๋Š” ์ฑ…์„ ๋งŒ๋“ค๋ ค๋Š” ์š”์ฒญ์ด ์žˆ๊ณ  name์ด ๋ชจ๋ธ์—์„œ ํ•„ํ„ฐ๋ง ๊ฐ€๋Šฅํ•œ ํ•„๋“œ์ธ ๊ฒฝ์šฐ:

# 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

์ œ์•ˆ ๋œ ํ•ด๋ฒ•

๋Œ€์‹  DRF ํ•„ํ„ฐ ๋ฐฑ์—”๋“œ๋ฅผ ๋‹ค์Œ ์ฝ”๋“œ๋กœ ์‚ฌ์šฉ์ž ์ง€์ • ์žฌ์ •์˜๋กœ ์ง€์ •ํ•˜์—ฌ ์ฝ”๋“œ์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

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์ž…๋‹ˆ๋‹ค. ์‹ ๊ณ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์ฒซ ๋ฒˆ์งธ ์ƒ๊ฐ์€ ์ด๊ฒƒ์ด ํด๋ผ์ด์–ธํŠธ API์˜ ๋ฒ„๊ทธ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์š”์ฒญ์„ ๊ตฌ์„ฑํ•  ๋•Œ ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์š”์ฒญ ๋ณธ๋ฌธ์„ ์ ์ ˆํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ž‘์—…์— ๋Œ€ํ•œ ํ•„ํ„ฐ๋ง์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์€ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„ํ„ฐ๋ง์€ ์—…๋ฐ์ดํŠธ ๋Œ€์ƒ์ด ๋˜๋Š” ๊ธฐ๋ณธ ์ฟผ๋ฆฌ ์ง‘ํ•ฉ์„ ์„ค์ •ํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋„๋ก ์—ด์–ด๋‘๊ฒ ์Šต๋‹ˆ๋‹ค.

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

์•ˆ๋…•ํ•˜์„ธ์š” @Sonictherocketman์ž…๋‹ˆ๋‹ค. ์‹ ๊ณ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์ฒซ ๋ฒˆ์งธ ์ƒ๊ฐ์€ ์ด๊ฒƒ์ด ํด๋ผ์ด์–ธํŠธ API์˜ ๋ฒ„๊ทธ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์š”์ฒญ์„ ๊ตฌ์„ฑํ•  ๋•Œ ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์š”์ฒญ ๋ณธ๋ฌธ์„ ์ ์ ˆํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ž‘์—…์— ๋Œ€ํ•œ ํ•„ํ„ฐ๋ง์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์€ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„ํ„ฐ๋ง์€ ์—…๋ฐ์ดํŠธ ๋Œ€์ƒ์ด ๋˜๋Š” ๊ธฐ๋ณธ ์ฟผ๋ฆฌ ์ง‘ํ•ฉ์„ ์„ค์ •ํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋„๋ก ์—ด์–ด๋‘๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ๊ทธ๊ฒƒ์ด ํด๋ผ์ด์–ธํŠธ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋ฉด ํ• ์ˆ˜๋ก ์ฟผ๋ฆฌ ์“ฐ๊ธฐ(ํŠนํžˆ ํŠน์ • ๋ฆฌ์†Œ์Šค์— ์“ฐ๊ธฐ)์— ๋Œ€ํ•œ ์ž‘์—…์ด ์‹ค์ œ๋กœ ์˜๋ฏธ๊ฐ€ ์—†๊ณ  ์Šคํ‚ค๋งˆ๊ฐ€ ํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ํ•„๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋น ๋ฅธ ํšŒ์‹ ์— ๊ฐ์‚ฌ๋“œ๋ฆฌ๋ฉฐ ์ด์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์ƒ๊ฐ์ด ๋งค์šฐ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์†Œ๊ฐ„, ๊ธฐ์ˆ (ํ˜„์žฌ ์ƒํƒœ)์„ ๋Šฅ๊ฐ€ํ•˜๋Š” _automagic_ ์ฝ”๋“œ ์ƒ์„ฑ์— ๋Œ€ํ•œ ์šฐ๋ฆฌ์˜ ์—ด๋ง์œผ๋กœ ์ธํ•ด ์—ฌ๊ธฐ์—์„œ ์ œํ•œ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์Šคํ‚ค๋งˆ(์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ˜•์‹)๋กœ (์•„์ง) ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด CoreAPI๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ‘œ์‹œํ•  ๋‚ ์งœ ๋ฒ”์œ„ ํ•„ํ„ฐ์— ๋Œ€ํ•ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. (์Šคํ‚ค๋งˆ ์ž‘์„ฑ์„ ์†์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ๋งŽ์ง€๋งŒ ๋ฌผ๋ก  ์•„๋ฌด๋„ ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ณ  ์‹ถ์–ด ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

๊ทธ๋Ÿฌ๋‚˜ ๋ฐœ์ „ํ•˜๊ณ  ๋„๊ตฌ๋„ ๋ฐœ์ „ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์„ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ํŠน์ • ๋ผ์ธ:

client.action('book', 'create', { 'name': 'My Awesome Book' });

์ฟผ๋ฆฌ ๋ฌธ์ž์—ด๊ณผ ์š”์ฒญ ๋ณธ๋ฌธ ๋ชจ๋‘์— ๋Œ€ํ•ด ๋™์ผํ•œ ์‚ฌ์ „์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ถ”์ƒํ™” ๋ˆ„์ถœ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ณธ๋ฌธ์„ ๋ณ„๋„์˜ ์œ„์น˜์— ์ง€์ •ํ•˜์—ฌ ์ด ์š”์ฒญ์„ ์ง์ ‘ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํ˜„์žฌ ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์ œ๋ณดํ•ด์ฃผ์…”์„œ ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

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