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์ ๋ฒ๊ทธ๋ผ๋ ๊ฒ์ ๋๋ค. ์์ฒญ์ ๊ตฌ์ฑํ ๋ ์ฟผ๋ฆฌ ๋ฌธ์์ด ๋งค๊ฐ๋ณ์์ ์์ฒญ ๋ณธ๋ฌธ์ ์ ์ ํ๊ฒ ๊ตฌ๋ถํ์ง ๋ชปํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์์ ํ์ง ์์ ์์ ์ ๋ํ ํํฐ๋ง์ ๋นํ์ฑํํ๋ ๊ฒ์ ์ฌ๋ฐ๋ฅด์ง ์์ต๋๋ค. ํํฐ๋ง์ ์ ๋ฐ์ดํธ ๋์์ด ๋๋ ๊ธฐ๋ณธ ์ฟผ๋ฆฌ ์งํฉ์ ์ค์ ํ ๋ ๋ฐ์ํฉ๋๋ค.
์ง๊ธ์ ์๊ฐํด๋ณผ ์ ์๋๋ก ์ด์ด๋๊ฒ ์ต๋๋ค.
๋๋ ๋ํ ๊ทธ๊ฒ์ด ํด๋ผ์ด์ธํธ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ์ง๋ง, ๊ทธ๊ฒ์ ๋ํด ์๊ฐํ๋ฉด ํ ์๋ก ์ฟผ๋ฆฌ ์ฐ๊ธฐ(ํนํ ํน์ ๋ฆฌ์์ค์ ์ฐ๊ธฐ)์ ๋ํ ์์ ์ด ์ค์ ๋ก ์๋ฏธ๊ฐ ์๊ณ ์คํค๋ง๊ฐ ํด์๋ ์ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ์ฉํ์ง ์์์ผ ํ๋ ๊ฒฝ์ฐ ํด๋น ํ๋๊ฐ ์์ต๋๋ค.
๋น ๋ฅธ ํ์ ์ ๊ฐ์ฌ๋๋ฆฌ๋ฉฐ ์ด์ ๋ํ ๊ทํ์ ์๊ฐ์ด ๋งค์ฐ ๊ถ๊ธํฉ๋๋ค.
๋ค์๊ฐ, ๊ธฐ์ (ํ์ฌ ์ํ)์ ๋ฅ๊ฐํ๋ _automagic_ ์ฝ๋ ์์ฑ์ ๋ํ ์ฐ๋ฆฌ์ ์ด๋ง์ผ๋ก ์ธํด ์ฌ๊ธฐ์์ ์ ํ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์คํค๋ง(์ฌ์ฉ ๊ฐ๋ฅํ ํ์)๋ก (์์ง) ํ ์ ์๋ ๊ฒ์ด ๋ง์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด CoreAPI๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ํ ๋ ์ง ๋ฒ์ ํํฐ์ ๋ํด ๋งค๊ฐ๋ณ์๋ฅผ ๊ทธ๋ฃนํํ ์ ์์ต๋๋ค. ๊ทธ๋ค์ ๊ด๋ จ์ด ์์ต๋๋ค. (์คํค๋ง ์์ฑ์ ์์ผ๋ก ํ ์ ์๋ ๊ฒ์ด ํจ์ฌ ๋ ๋ง์ง๋ง ๋ฌผ๋ก ์๋ฌด๋ ๊ทธ๋ ๊ฒ ํ๊ณ ์ถ์ด ํ์ง ์์ต๋๋ค.)
๊ทธ๋ฌ๋ ๋ฐ์ ํ๊ณ ๋๊ตฌ๋ ๋ฐ์ ํฉ๋๋ค. ๊ฐ์ ๋ ๊ฒ์ ๋๋ค.
์ด ํน์ ๋ผ์ธ:
client.action('book', 'create', { 'name': 'My Awesome Book' });
์ฟผ๋ฆฌ ๋ฌธ์์ด๊ณผ ์์ฒญ ๋ณธ๋ฌธ ๋ชจ๋์ ๋ํด ๋์ผํ ์ฌ์ ์ ์ฌ์ฉํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์ถ์ํ ๋์ถ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์์ ๋ณธ๋ฌธ์ ๋ณ๋์ ์์น์ ์ง์ ํ์ฌ ์ด ์์ฒญ์ ์ง์ ์์ฑํ๊ณ ์ถ์ต๋๋ค.
์ด๊ฒ์ ํ์ฌ ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ๋ค๋ฃฐ ์ ์๋ ๊ฒ์ด ์๋๋๋ค. ๊ทธ๋๋ ์ ๋ณดํด์ฃผ์ ์ ๋ค์ ํ๋ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์๋ ํ์ธ์ @Sonictherocketman์ ๋๋ค. ์ ๊ณ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๋ด ์ฒซ ๋ฒ์งธ ์๊ฐ์ ์ด๊ฒ์ด ํด๋ผ์ด์ธํธ API์ ๋ฒ๊ทธ๋ผ๋ ๊ฒ์ ๋๋ค. ์์ฒญ์ ๊ตฌ์ฑํ ๋ ์ฟผ๋ฆฌ ๋ฌธ์์ด ๋งค๊ฐ๋ณ์์ ์์ฒญ ๋ณธ๋ฌธ์ ์ ์ ํ๊ฒ ๊ตฌ๋ถํ์ง ๋ชปํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์์ ํ์ง ์์ ์์ ์ ๋ํ ํํฐ๋ง์ ๋นํ์ฑํํ๋ ๊ฒ์ ์ฌ๋ฐ๋ฅด์ง ์์ต๋๋ค. ํํฐ๋ง์ ์ ๋ฐ์ดํธ ๋์์ด ๋๋ ๊ธฐ๋ณธ ์ฟผ๋ฆฌ ์งํฉ์ ์ค์ ํ ๋ ๋ฐ์ํฉ๋๋ค.
์ง๊ธ์ ์๊ฐํด๋ณผ ์ ์๋๋ก ์ด์ด๋๊ฒ ์ต๋๋ค.