์๋
!
์ด ๋ฌธ์ ๊ฐ ์ฌ๊ธฐ์์ ์ด๋ฏธ ํด๊ฒฐ๋์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์ ์ ํ ํด๊ฒฐ์ฑ
์ ์ฐพ์ ์ ์์ต๋๋ค.
๋ค๋ฅธ ์์ ์ ๋ํ ๋ค์ํ ์ ๋ณด๋ฅผ ํฌํจํ๊ณ ์ฟผ๋ฆฌํ ๋ ํ์ํ image = models.ImageField ํ๋๋ ํฌํจํ๋ Store ํด๋์ค๊ฐ ์๋ ๋ชจ๋ธ์ด ์์ต๋๋ค.
๋ฌธ์์์ ๋ชจ๋ ๊ฒ์ ์๋ํ์ง๋ง ๋ด ์ ์ธ์ ๋ด๊ฐ ํํฐ๋งํ๋ ํ๋๋ฅผ ๋ฌด์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
class StoreFilter(django_filters.FilterSet):
class Meta:
model = Store
exclude = ['image']
fields = {
'name': ['exact', 'contains'],
'created': ['exact', 'year__gt'],
}
์ด๊ฒ์ด ๋ด๊ฐ ํํฐ๋งํ๋ ค๊ณ ํ๋ ๊ฒ์ด๋ฉฐ AssertionError๊ฐ ๊ณ์ ๋ฐ์ํฉ๋๋ค. ๋ด๊ฐ ๋ฌด์์ ๋์น๊ณ ์๋์ง ์ ์ ์์ต๋๊น? ๋ด models.py์์ ์ด๋ฏธ์ง ๋ผ์ธ์ ์ฃผ์์ ๋ค๋ ์ฆ์ ์๋ํฉ๋๋ค.
์น์ ํ๋
์๋
ํ์ธ์ @msbt - ์ฌ๊ธฐ์ ์ผ๋ถ ์ ๋ณด๊ฐ ๋๋ฝ๋์์ต๋๋ค. ๋น ๋ฅธ ํ
์คํธ๋ฅผ ์คํํ๋๋ฐ ์ธ๊ธ๋ AssertionError
๊ฐ ๋ฐ์ํ์ง ์์์ต๋๋ค. ์๋์์ ๋ณผ ์ ์๋ฏ์ด ์ด๋ฏธ์ง ํ๋์ ๋ํ ํํฐ๊ฐ ์์ฑ๋์ง ์์์ต๋๋ค.
```ํ์ด์ฌ
django.db ๊ฐ์ ธ์ค๊ธฐ ๋ชจ๋ธ์์
ํด๋์ค ์คํ ์ด(models.Model):
์ด๋ฆ = ๋ชจ๋ธ.CharField(์ต๋ ๊ธธ์ด=80)
์์ฑ = models.DateField()
์ด๋ฏธ์ง = ๋ชจ๋ธ.์ด๋ฏธ์งํ๋()
django_filters ๊ฐ์ ธ์ค๊ธฐ
ํด๋์ค StoreFilter(django_filters.FilterSet):
ํด๋์ค ๋ฉํ:
๋ชจ๋ธ = ๋งค์ฅ
์ ์ธ = ['์ด๋ฏธ์ง']
ํ๋ = {
'์ด๋ฆ': ['์ ํํ', 'ํฌํจ'],
'์์ฑ๋จ': ['์ ํํ', '์ฐ๋__gt'],
}
[8]์์: StoreFilter.base_filters
์์[8]:
OrderedDict([('์ด๋ฆ',
('์ด๋ฆ__ํฌํจ',
('๋ง๋ค์ด์ง',
('์์ฑ๋__๋
__gt',
````
์ ์ฒด ๋ชจ๋ธ ๋ฐ ํํฐ ์ฝ๋๋ฅผ ์ ๊ณตํ ์ ์์ต๋๊น? ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ๋ฌธ์ ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ ์ ๋ ์๊ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
์๋ , ๋ค์ ๋์์์ค์ ๊ณ ๋ง์! ๋ด๊ฐ ๋ฌด์์ ์๋ชปํ๋์ง ์์๋ผ ์๊ฐ์ ์กฐ๊ธ๋ง ๋ ์ฃผ์ธ์. ์ด๋ณด์ ์ธ ์ค์๋ผ๋ฉด ๋นํฉ์ค๋ฌ์ธ ๊ฒ์ ๋๋ค. ;)
์๋ ํ์ธ์ @msbt - ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์์๋์ต๋๊น, ์๋๋ฉด ๋ซ์ ์ ์์ต๋๊น?
์ง๊ธ์ ์๊ฐ์ด ์์ผ๋ ๋ซ๊ณ ๋ค์ ์๋ํ๋ค๊ฐ ๋งํ๋ฉด ๋ค์ ๋ฐฉ๋ฌธํ๋๋ก ํ ๊ฒ์ ;)
@msbt ์ด ๋ฌธ์ ์ ๋ํ ์์ด๋์ด๊ฐ ์์ต๋๊น? ๋๋ ๊ฐ์ ๊ฒ์ ๊ฐ์ง๊ณ ์๋ค
@georgezouq ๋๋ ค์ํ์ง ์๊ณ ๋ค๋ฅธ ์ด์ ๋ก ํ๋ก์ ํธ๋ฅผ ํฌ๊ธฐํ๊ณ ์๋ฃจ์ ์ ์ฐพ์ง ๋ชปํ์ต๋๋ค
์ญ์ถ์ ๋ถํ๋๋ฆฝ๋๋ค. ๐
Internal Server Error: /stadiums/
Traceback (most recent call last):
File "C:\Users\default_user\PycharmProjects\pina_colada\venv\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "C:\Users\default_user\PycharmProjects\pina_colada\venv\lib\site-packages\django\core\handlers\base.py", line 126, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:\Users\default_user\PycharmProjects\pina_colada\venv\lib\site-packages\django\core\handlers\base.py", line 124, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\default_user\PycharmProjects\pina_colada\venv\lib\site-packages\django\views\generic\base.py", line 68, in view
return self.dispatch(request, *args, **kwargs)
File "C:\Users\*\PycharmProjects\pina_colada\venv\lib\site-packages\django\views\generic\base.py", line 88, in dispatch
return handler(request, *args, **kwargs)
File "C:\Users\*\PycharmProjects\pina_colada\venv\lib\site-packages\django_filters\views.py", line 77, in get
filterset_class = self.get_filterset_class()
File "C:\Users\*\PycharmProjects\pina_colada\venv\lib\site-packages\django_filters\views.py", line 35, in get_filterset_class
return filterset_factory(model=self.model, fields=self.filterset_fields)
File "C:\Users\*\PycharmProjects\pina_colada\venv\lib\site-packages\django_filters\filterset.py", line 459, in filterset_factory
(FilterSet,), {'Meta': meta})
File "C:\Users\default_user\PycharmProjects\pina_colada\venv\lib\site-packages\django_filters\filterset.py", line 71, in __new__
new_class.base_filters = new_class.get_filters()
File "C:\Users\default_user\PycharmProjects\pina_colada\venv\lib\site-packages\django_filters\filterset.py", line 345, in get_filters
filters[filter_name] = cls.filter_for_field(field, field_name, lookup_expr)
File "C:\Users\default_user\PycharmProjects\pina_colada\venv\lib\site-packages\django_filters\filterset.py", line 377, in filter_for_field
) % (cls.__name__, field_name, lookup_expr, field.__class__.__name__)
AssertionError: StadiumFilterSet resolved field 'graphic' with 'exact' lookup to an unrecognized field type FileField. Try adding an override to 'Meta.filter_overrides'. See: https://django-filter.readthedocs.io/en/master/ref/filterset.html#customise-filter-generation-with-filter-overrides
[13/Dec/2018 08:23:58] "GET /stadiums/?page=1 HTTP/1.1" 500 108150
class StadiumFilter(django_filters.FilterSet):
name = django_filters.CharFilter(lookup_expr='iexact')
class Meta:
model = Stadium
exclude = ['graphic']
filter_overrides = {
models.FileField: {
'filter_class': django_filters,
'extra': lambda f: {
'lookup_expr': 'icontains',
},
},
}
@carltongibson ์ข ๋ด์ฃผ์ธ์
์ผ๋ฐ ๋ณด๊ธฐ๋ฅผ ์ฌ์ฉํ๊ณ ์์๊ธฐ ๋๋ฌธ์ ์ฌ์ ์๋ฅผ ๋ฌด์ํ์ต๋๋ค. ์ด๊ฒ์ ์ผ์์ ์ผ๋ก ๋ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง๋ง ๋ด ๊ณ ๊ฐ์ ํํฐ์ ํน์์ฑ์ผ๋ก ์ธํด ๋๋ฅผ ๊ท์ฐฎ๊ฒํฉ๋๋ค. ์ด๊ฒ ์ข ๋ด์ฃผ์๊ฒ ์ด์?
urlpatterns = [
path('', views.StadiumFilterView.as_view(model=Stadium,
filterset_fields=['name', 'country']), name="stadium_index"),
]
fields, exclude, filter_overrides in Meta๋ ์ด AssertionError
์ค๋ฅ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํฉ๋๋ค. FilterView
+ filter_class = MyFilterSet
๋ฅผ ์ฌ์ฉํ ๋ ํ๋๋ฅผ ์ ์ธํ๋ ค๋ฉด ๋ณด๊ธฐ ์๋์ filter_fields๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค.
๊ทธ๋ ์ง ์์ผ๋ฉด def filter_for_field(cls, f, name, lookup_expr='exact')
๊ฐ ๋ชจ๋ ํ๋์์ ์คํ๋ฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์๋ ํ์ธ์ @msbt - ์ฌ๊ธฐ์ ์ผ๋ถ ์ ๋ณด๊ฐ ๋๋ฝ๋์์ต๋๋ค. ๋น ๋ฅธ ํ ์คํธ๋ฅผ ์คํํ๋๋ฐ ์ธ๊ธ๋
AssertionError
๊ฐ ๋ฐ์ํ์ง ์์์ต๋๋ค. ์๋์์ ๋ณผ ์ ์๋ฏ์ด ์ด๋ฏธ์ง ํ๋์ ๋ํ ํํฐ๊ฐ ์์ฑ๋์ง ์์์ต๋๋ค.```ํ์ด์ฌ
๋ชจ๋ธ
django.db ๊ฐ์ ธ์ค๊ธฐ ๋ชจ๋ธ์์
ํด๋์ค ์คํ ์ด(models.Model):
์ด๋ฆ = ๋ชจ๋ธ.CharField(์ต๋ ๊ธธ์ด=80)
์์ฑ = models.DateField()
์ด๋ฏธ์ง = ๋ชจ๋ธ.์ด๋ฏธ์งํ๋()
ํํฐ
django_filters ๊ฐ์ ธ์ค๊ธฐ
ํด๋์ค StoreFilter(django_filters.FilterSet):
ํด๋์ค ๋ฉํ:
๋ชจ๋ธ = ๋งค์ฅ
์ ์ธ = ['์ด๋ฏธ์ง']
ํ๋ = {
'์ด๋ฆ': ['์ ํํ', 'ํฌํจ'],
'์์ฑ๋จ': ['์ ํํ', '์ฐ๋__gt'],
}
์ฝ์ ์ถ๋ ฅ
[8]์์: StoreFilter.base_filters),),),)])
์์[8]:
OrderedDict([('์ด๋ฆ',
('์ด๋ฆ__ํฌํจ',
('๋ง๋ค์ด์ง',
('์์ฑ๋__๋ __gt',
````
์ ์ฒด ๋ชจ๋ธ ๋ฐ ํํฐ ์ฝ๋๋ฅผ ์ ๊ณตํ ์ ์์ต๋๊น? ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ๋ฌธ์ ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ ์ ๋ ์๊ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.