class BooksFilter(filters.FilterSet):
class Meta:
model = Books
νν° μΈνΈ ν΄λμ€μμ fields
μ΅μ
μ μλ΅νλ©΄(μμ κ°μ΄) λͺ¨λ λͺ¨λΈ νλκ° νν° μΈνΈμ ν¬ν¨λ©λλ€. μ΄λ μμμ΄ νμ κ°λ₯ν APIμμ λ λλ§λλ DRFμ ν¨κ» μ¬μ©λ λ μ 보 λμΆλ‘ μ΄μ΄μ§ μ μμ΅λλ€.
Djangoμ DRF λͺ¨λ μ μ¬μ μΈ λ³΄μ λ¬Έμ λ‘ μΈν΄ μμ/μ§λ ¬ λ³νκΈ°μ νλλ₯Ό λͺ
μμ μΌλ‘ μ§μ ν΄μΌ ν©λλ€. μ΄κ²μ django-filter νν°μ
μμλ νμν©λλ€.
http://www.django-rest-framework.org/api-guide/serializers/#specifying -what-fields-to-include
https://docs.djangoproject.com/en/1.10/topics/forms/modelforms/#selecting -the-fields-to-use
PRμ κΈ°μ¬νκ±°λ νμν κ²½μ° μ 보 μ μΆλ‘ μ΄μ΄μ§ μ μλ μν©μ λν΄ μμΈν μ€λͺ νκ² μ΅λλ€.
@nip3o λ€. μ΄κ²μ 보κ²λμ΄ κΈ°μ©λλ€.
λν DRFμ λ°λΌ νλμ μ μΈλ νν°κ° νμνλλ‘ νκ³ μΆμ΅λλ€.
btw - λ°μ΄ν° λμΆμ #451μ μν΄ λΆλΆμ μΌλ‘ ν΄κ²°λμμ΅λλ€. μ§κΈ λΉμ₯μ μ μλμ§ μμ/λ³κ²½λλ λμμ λν μ¬μ© μ€λ¨ κ²½κ³ κ° νμλμ΄μΌ ν©λλ€. 1.0μμ μλ‘μ΄ λμμ Meta.fields
λλ Meta.fields = None
κ° μμΌλ©΄ μ무 κ²λ νμ§ μλλ€λ κ²μ
λλ€.
λν νλμ DRFμ λ°λΌ μ μΈλ νν°κ° νμνλλ‘ νκ³ μΆμ΅λλ€.
μ΄κ²μ΄ Meta.fields
μ λν dict ꡬ문과 μ΄λ»κ² μλνλμ§ μ λͺ¨λ₯΄κ² μ΅λλ€. μ:
class UserFilter(filters.FilterSet):
username = filters.CharFilter()
class Meta:
model = User
fields = {
'name': ['contains', 'startswith', 'endswith', ...'],
???
}
μ΄κ²μ΄ dict ꡬ문과 μ΄λ»κ² μλνλμ§ μ λͺ¨λ₯΄κ² μ΅λλ€.
λ¬Όλ‘ .
λλ μ¬μ ν μ΄κ²μ λν΄ μΌμ’
μ :-1:μ
λλ€. Meta.fields
dict ꡬ문 w/ μ μΈλ νν°λ₯Ό ν΄κ²°νλ λ°©λ²μ΄ μμ΅λλ€. μ μ΄λ μ΄μνμ§ μμ λ°©μμΌλ‘:
class UserFilter(filters.FilterSet):
username = filters.CharFilter(name='username', lookup_expr='exact')
username_like = filters.CharFilter(name='username', lookup_expr='icontains')
relevance = filters.CharFilter(method='filter_relevance')
class Meta:
model = User
fields = {
'name': ['contains', 'startswith', 'endswith', ...'],
'username': ['exact'], # match w/ the lookup_expr?
'username_like': ['icontains'],
'relevance': [???] # What about method filters?
}
λν μ΄ μꡬ μ¬νμ FilterSet.FILTER_DEFAULTS
μ μλ νλ ν΄λμ€λ₯Ό μμνμ§ μλ μ¬μ©μ μ§μ λͺ¨λΈ νλμ λν λ¬Έμ κ° λ°μν©λλ€. μ¬μ©μ μ μ νλμλ λ€μμ΄ νμν©λλ€.
class NetworkSettingFilter(FilterSet):
mask = MaskFilter(...)
class Meta:
model = NetworkSetting
fields = ['mask']
filter_overrides = {
SubnetMaskField: {'filter_class': MaskFilter},
}
# vs.
class NetworkSettingFilter(FilterSet):
mask = MaskFilter(...)
class Meta:
model = NetworkSetting
μ°Έκ³ μ¬ν: μ΄ λμ€ μμ μ μ°λ¦¬κ° _κ³ μΉ μ μλ_ κ²μ λλ€. Djangoμ λͺ¨λΈ νμ λμ DRFμ μ§λ ¬ λ³νκΈ°μ²λΌ μλνλλ‘ μλ μμ±μ λ€μ μμ±ν΄μΌ ν©λλ€. μ΄λ μͺ½μ΄λ , λ΄ μ£Όμ κ΄μ¬μ¬λ ꡬ문 μΆ©λμ λλ€.
μ’μμ. μΌλ¨ λλμ.
λλ μλ μ μμ μ’μνλ€. λ²μλ₯Ό _ fields
κ° λͺ©λ‘μΈ κ²½μ°..._λ‘ λ²μλ₯Ό μ§μ νλ κ²½ν₯μ΄ μμ΅λλ€. νμ§λ§ μ‘°κΈ λ μκ°ν΄μΌ ν©λλ€.
μ½κ° μλ€κ° λ§μ§λ§ μλ λ¬Έμ μ λν΄μλ§ λ€μ μ΄μ νλ₯Ό μμ±νκ² μ΅λλ€.
fields
λλ exclude
λ₯Ό μ μΈν΄μΌ ν©λλ€. fields = '__all__'
λ μ΅μκ°μ΄μ΄μΌ ν©λλ€.
(λͺ©λ‘ μΌμΉλ₯Ό κ°μ νμ§ μλ κ²μ λ€μ λμμ¬ μ μλ λ¬Έμ μ λλ€.)
κ΄λ ¨ DRF μ½λλ λ€μ κ³Ό κ°μ΅λλ€.
assert not (fields is None and exclude is None), (
"Creating a ModelSerializer without either the 'fields' attribute "
"or the 'exclude' attribute has been deprecated since 3.3.0, "
"and is now disallowed. Add an explicit fields = '__all__' to the "
"{serializer_class} serializer.".format(
serializer_class=self.__class__.__name__
),
)
filters_for_model
μ λΉμ·ν μΆκ° κ° νμν©λλ€.
# Setting exclude with no fields implies all other fields.
if exclude is not None and fields is None:
fields = ALL_FIELDS
μμνλ €λ©΄ λ μ΄μ μ¬μ©λμ§ μμμΌ ν©λλ€.
fields
λλexclude
λ₯Ό μ μΈν΄μΌ ν©λλ€.fields = '__all__'
λ μ΅μκ°μ΄μ΄μΌ ν©λλ€.
λλ νμ€ν κ·Έ λ€μ κ° μ μμ΅λλ€. νμ¬ PR μμ μ νκ³ μμ΅λλ€.
λ©μλ.
κ°κ° μκ°μ λν΄ κ±±μ νμ§ λ§μμμ€. μ£Όμ λ²μ λ³κ²½μ λν μμ λ³κ²½μ λλ€. λ³κ²½ λ ΈνΈμ λͺ μν΄ λμμμ€. ππ½
κ°κ° μκ°μ λν΄ κ±±μ νμ§ λ§μμμ€. μ£Όμ λ²μ λ³κ²½μ λν μμ λ³κ²½μ λλ€. λ³κ²½ λ ΈνΈμ λͺ μν΄ λμμμ€.
μλλ μ½κ° λ€λ₯΄μ§λ§ μ€μ λ‘ μ¬κΈ° μμ λ€λ£¨μμ΅λλ€.
λν νμ¬ filters_for_model
λ₯Ό 리ν©ν λ§νμ¬ μ μΈλ νν°μ λν νν° μμ±μ μλνμ§ μμ΅λλ€. (μ΄κ²μ fields = ['mask']
κ° λΆνμν μμΈλ₯Ό λ°μμν€λ μλΈλ·/λ§μ€ν¬ μμ κ΄λ ¨μ΄ μμ΅λλ€.
νμ #550
κ°μ₯ μ μ©ν λκΈ
btw - λ°μ΄ν° λμΆμ #451μ μν΄ λΆλΆμ μΌλ‘ ν΄κ²°λμμ΅λλ€. μ§κΈ λΉμ₯μ μ μλμ§ μμ/λ³κ²½λλ λμμ λν μ¬μ© μ€λ¨ κ²½κ³ κ° νμλμ΄μΌ ν©λλ€. 1.0μμ μλ‘μ΄ λμμ
Meta.fields
λλMeta.fields = None
κ° μμΌλ©΄ μ무 κ²λ νμ§ μλλ€λ κ²μ λλ€.