рдореИрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░ рдЧрдпрд╛ тАж
Traceback (most recent call last):
[..]
File "/usr/local/lib/python3.7/site-packages/django/forms/forms.py", line 393, in _clean_fields
value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
File "/usr/local/lib/python3.7/site-packages/django_filters/widgets.py", line 201, in value_from_datadict
return value.split(',')
AttributeError: 'list' object has no attribute 'split'
рдФрд░ рдкрд╛рдпрд╛ рдХрд┐ рдХреЛрдб ...
https://github.com/carltongibson/django-filter/blob/1f47e36b614724a8735e0457fa511dcaf5448481/django_filters/widgets.py#L195 -L202
... super().value_from_datadict(data, files, name)
рд╕реВрдЪреА рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдордЬрдмреВрдд рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ?
рд╣рд╛рдп @рдореЛрд╕реЗрдмред рдХреНрдпрд╛ рдЖрдк рдЙрд╕ рдлрд╝рд┐рд▓реНрдЯрд░рд╕реЗрдЯ рдХреЛрдб рдХреЛ рдкреЗрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдЯреНрд░реЗрд╕ рдмреИрдХ рдХреА рдЕрдВрддрд┐рдо рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдЕрдкрд╡рд╛рдж рдХреЛ рдХреНрдпреЛрдВ рдорд╛рд░рд╛ред
рдкреВрд░реНрдг рдЯреНрд░реЗрд╕рдмреИрдХ:
Traceback (most recent call last):
File "/usr/local/lib/python3.7/wsgiref/handlers.py", line 137, in run
self.result = application(self.environ, self.start_response)
File "/usr/local/lib/python3.7/site-packages/django/contrib/staticfiles/handlers.py", line 65, in __call__
return self.application(environ, start_response)
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/wsgi.py", line 141, in __call__
response = self.get_response(request)
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/base.py", line 75, in get_response
response = self._middleware_chain(request)
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 36, in inner
response = response_for_exception(request, exc)
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 90, in response_for_exception
response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/usr/local/lib/python3.7/site-packages/django/utils/deprecation.py", line 94, in __call__
response = response or self.get_response(request)
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 36, in inner
response = response_for_exception(request, exc)
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 90, in response_for_exception
response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/usr/local/lib/python3.7/site-packages/django/utils/deprecation.py", line 94, in __call__
response = response or self.get_response(request)
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 36, in inner
response = response_for_exception(request, exc)
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 90, in response_for_exception
response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/usr/local/lib/python3.7/site-packages/django/utils/deprecation.py", line 94, in __call__
response = response or self.get_response(request)
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 36, in inner
response = response_for_exception(request, exc)
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 90, in response_for_exception
response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/usr/local/lib/python3.7/site-packages/django/utils/deprecation.py", line 94, in __call__
response = response or self.get_response(request)
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 36, in inner
response = response_for_exception(request, exc)
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 90, in response_for_exception
response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/usr/local/lib/python3.7/site-packages/django/utils/deprecation.py", line 94, in __call__
response = response or self.get_response(request)
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 36, in inner
response = response_for_exception(request, exc)
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 90, in response_for_exception
response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/usr/local/lib/python3.7/site-packages/django/utils/deprecation.py", line 94, in __call__
response = response or self.get_response(request)
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 36, in inner
response = response_for_exception(request, exc)
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 90, in response_for_exception
response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/usr/local/lib/python3.7/site-packages/django_global_request/middleware.py", line 15, in __call__
return self.get_response(request)
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 36, in inner
response = response_for_exception(request, exc)
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 90, in response_for_exception
response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/base.py", line 145, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/base.py", line 143, in _get_response
response = response.render()
File "/usr/local/lib/python3.7/site-packages/django/template/response.py", line 106, in render
self.content = self.rendered_content
File "/usr/local/lib/python3.7/site-packages/rest_framework/response.py", line 72, in rendered_content
ret = renderer.render(self.data, accepted_media_type, context)
File "/usr/local/lib/python3.7/site-packages/rest_framework/renderers.py", line 733, in render
context = self.get_context(data, accepted_media_type, renderer_context)
File "/usr/local/lib/python3.7/site-packages/rest_framework/renderers.py", line 710, in get_context
'filter_form': self.get_filter_form(data, view, request),
File "/usr/local/lib/python3.7/site-packages/rest_framework/renderers.py", line 642, in get_filter_form
html = backend().to_html(request, queryset, view)
File "/usr/local/lib/python3.7/site-packages/rest_framework_filters/backends.py", line 52, in to_html
return super().to_html(request, queryset, view)
File "/usr/local/lib/python3.7/site-packages/django_filters/rest_framework/backends.py", line 105, in to_html
return template.render(context, request)
File "/usr/local/lib/python3.7/site-packages/django/template/backends/django.py", line 61, in render
return self.template.render(context)
File "/usr/local/lib/python3.7/site-packages/django/template/base.py", line 171, in render
return self._render(context)
File "/usr/local/lib/python3.7/site-packages/django/template/base.py", line 163, in _render
return self.nodelist.render(context)
File "/usr/local/lib/python3.7/site-packages/django/template/base.py", line 937, in render
bit = node.render_annotated(context)
File "/usr/local/lib/python3.7/site-packages/django/template/base.py", line 904, in render_annotated
return self.render(context)
File "/usr/local/lib/python3.7/site-packages/crispy_forms/templatetags/crispy_forms_tags.py", line 199, in render
c = self.get_render(context).flatten()
File "/usr/local/lib/python3.7/site-packages/crispy_forms/templatetags/crispy_forms_tags.py", line 118, in get_render
actual_form.form_html = helper.render_layout(actual_form, node_context, template_pack=self.template_pack)
File "/usr/local/lib/python3.7/site-packages/crispy_forms/helper.py", line 308, in render_layout
template_pack=template_pack
File "/usr/local/lib/python3.7/site-packages/crispy_forms/layout.py", line 140, in render
return self.get_rendered_fields(form, form_style, context, template_pack, **kwargs)
File "/usr/local/lib/python3.7/site-packages/crispy_forms/layout.py", line 104, in get_rendered_fields
for field in self.fields
File "/usr/local/lib/python3.7/site-packages/crispy_forms/layout.py", line 104, in <genexpr>
for field in self.fields
File "/usr/local/lib/python3.7/site-packages/crispy_forms/utils.py", line 148, in render_field
html = template.render(context)
File "/usr/local/lib/python3.7/site-packages/django/template/backends/django.py", line 61, in render
return self.template.render(context)
File "/usr/local/lib/python3.7/site-packages/django/template/base.py", line 171, in render
return self._render(context)
File "/usr/local/lib/python3.7/site-packages/django/template/base.py", line 163, in _render
return self.nodelist.render(context)
File "/usr/local/lib/python3.7/site-packages/django/template/base.py", line 937, in render
bit = node.render_annotated(context)
File "/usr/local/lib/python3.7/site-packages/django/template/base.py", line 904, in render_annotated
return self.render(context)
File "/usr/local/lib/python3.7/site-packages/django/template/defaulttags.py", line 309, in render
return nodelist.render(context)
File "/usr/local/lib/python3.7/site-packages/django/template/base.py", line 937, in render
bit = node.render_annotated(context)
File "/usr/local/lib/python3.7/site-packages/django/template/base.py", line 904, in render_annotated
return self.render(context)
File "/usr/local/lib/python3.7/site-packages/django/template/defaulttags.py", line 309, in render
return nodelist.render(context)
File "/usr/local/lib/python3.7/site-packages/django/template/base.py", line 937, in render
bit = node.render_annotated(context)
File "/usr/local/lib/python3.7/site-packages/django/template/base.py", line 904, in render_annotated
return self.render(context)
File "/usr/local/lib/python3.7/site-packages/django/template/defaulttags.py", line 302, in render
match = condition.eval(context)
File "/usr/local/lib/python3.7/site-packages/django/template/defaulttags.py", line 876, in eval
return self.value.resolve(context, ignore_failures=True)
File "/usr/local/lib/python3.7/site-packages/django/template/base.py", line 671, in resolve
obj = self.var.resolve(context)
File "/usr/local/lib/python3.7/site-packages/django/template/base.py", line 796, in resolve
value = self._resolve_lookup(context)
File "/usr/local/lib/python3.7/site-packages/django/template/base.py", line 837, in _resolve_lookup
current = getattr(current, bit)
File "/usr/local/lib/python3.7/site-packages/django/forms/boundfield.py", line 74, in errors
return self.form.errors.get(self.name, self.form.error_class())
File "/usr/local/lib/python3.7/site-packages/django/forms/forms.py", line 180, in errors
self.full_clean()
File "/usr/local/lib/python3.7/site-packages/django/forms/forms.py", line 381, in full_clean
self._clean_fields()
File "/usr/local/lib/python3.7/site-packages/django/forms/forms.py", line 393, in _clean_fields
value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
File "/usr/local/lib/python3.7/site-packages/django_filters/widgets.py", line 201, in value_from_datadict
return value.split(',')
AttributeError: 'list' object has no attribute 'split'
[12/Jul/2019 13:49:06] "GET /XXXXXXXX/?ordering=first_name HTTP/1.1" 500 59
рдпрд╣ рдПрдХ рд╕реВрдЪреА рдмреНрд░рд╛рдЙрдЬрд╝ рдХрд░рдиреЗ рд╕реЗ рд╣реИ рдЬрд╣рд╛рдВ django-rest-framework рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред
рд╣рд╛рдп @рдореЛрд╕реЗрдмред рдХреНрдпрд╛ рдЖрдк рдЙрд╕ рдлрд╝рд┐рд▓реНрдЯрд░рд╕реЗрдЯ рдХреЛрдб рдХреЛ рдкреЗрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?
рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдЕрднреА рддрдХ рдХреЛрдб рдХреЗ рдЙрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХреЛрдИ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИред рдпрд╣ рд╕рдм рдбреАрдЖрд░рдПрдл рджреНрд╡рд╛рд░рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЕрднреА рддрдХ рдпрдХреАрди рдирд╣реАрдВред
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реА рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рд╣реИред рдорд╛рдлрд╝ рдХрд░рдирд╛!
рдЖрдкрдХреЗ рдПрдкреАрдЖрдИ рджреГрд╢реНрдп рдореЗрдВ рдпрд╛ рддреЛ filterset_class
рдпрд╛ filterset_fields
рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдпрджрд┐ рдЖрдк django-filter рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ filter_class
рдФрд░ filter_fields
ред
рдореБрдЭреЗ filter_class
рдХрд╛ рдЙрдкрдпреЛрдЧ рдорд┐рд▓рд╛ - рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдореБрдЭреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХреА рдХрд┐ django-filter 2.0 рдореЗрдВ рдкреНрд░рд╡рд╛рд╕рди рдЗрд╕рдХреЗ рдЕрдВрдд рддрдХ рдареАрдХ рд╕реЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдардВрдбрд╛!
рдХреНрдпрд╛ django-filter рдХреЛ рдкреВрд░реНрд╡-2.x рдмрдЪреЗ рд╣реБрдП рдкрджрд╛рд░реНрдереЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдФрд░ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдиреЗ рд╕реЗ, рдЕрд╡рдзрд╛рд░рдгрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдХреБрдЫ рд░реЛрдХ рд░рд╣рд╛ рд╣реИ? рдХреНрдпрд╛ рдпрд╣ рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕реЗ рдпрд╛рдж рдХрд┐рдпрд╛? рдХреНрдпрд╛ рдЗрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдб рдЪреЗрддрд╛рд╡рдиреА рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡рд╛рдЧрдд рдпреЛрдЧреНрдп рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реЛрдЧреА?
v2.0 рдиреЗ рдореМрдЬреВрджрд╛ рдмрд╣рд┐рд╖реНрдХрд░рдг рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдХреЛ v1.0 рдФрд░ рдлрд┐рд░ django-filter рдХреЗ v1.1 рдХреЗ рд╡рд┐рд░реБрджреНрдз рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдЬрдм рдЖрдк рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВрдЧреЗ рддреЛ рдпрд╣ рдЕрдкрдиреЗ рдЖрдк рд╣рд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдирд╣реАрдВ рддреЛ рд▓реМрдЯ рдЖрдУред
рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдбреЗрдореЛ рдЕрдм https://github.com/moseb/django-filter-issue-1103-demo рдкрд░ рд╣реИред рдХреГрдкрдпрд╛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЖрдкрдХреЛ рдзрдиреНрдпрд╡рд╛рдж!
рдЖрд╣, рдпрд╣ ModelMultipleChoiceFilter
рд╕реАрдПрд╕рд╡реА рдорд┐рд╢реНрд░рдг рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде in
рд▓реБрдХрдЕрдк рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдпрд╣рд╛рдВ рджреЛ рдЕрд▓рдЧ рд▓реЗрдХрд┐рди рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЗред
рдЖрдкрдХреЛ m2m рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП in
рд▓реБрдХрдЕрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдмрд╣реБрд╡рд┐рдХрд▓реНрдкреА рдлрд╝рд┐рд▓реНрдЯрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдирдорд╕реНрддреЗ!
рдЖрд╣, рдпрд╣
ModelMultipleChoiceFilter
рд╕реАрдПрд╕рд╡реА рдорд┐рд╢реНрд░рдг рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рдеin
рд▓реБрдХрдЕрдк рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдпрд╣рд╛рдВ рджреЛ рдЕрд▓рдЧ рд▓реЗрдХрд┐рди рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЗред
рдХреНрдпрд╛ рдЗрди рдореБрджреНрджреЛрдВ рдХреЗ рд▓рд┐рдП GitHub рдкрд░ рдореМрдЬреВрджрд╛ рдЯрд┐рдХрдЯ рд╣реИрдВ?
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ BaseCSVWidget.value_from_datadict
рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдордЬрдмреВрдд рдмрдирд╛рдиреЗ рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрдХреЗрд▓реЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдареАрдХ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛? (рдореИрдВ рдЕрднреА рддрдХ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛рдпрд╛ рд╣реВрдВред)
рдЖрдкрдХреЛ m2m рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП
in
рд▓реБрдХрдЕрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдмрд╣реБрд╡рд┐рдХрд▓реНрдкреА рдлрд╝рд┐рд▓реНрдЯрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
in
exact
рд╕реЗ рдЕрдзрд┐рдХ рдХреЗ рдХрдИ рдорд╛рдиреЛрдВ рдХреЗ рд╡рд┐рд░реБрджреНрдз рдЬрд╛рдБрдЪ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЕрдЧрд░ рдореИрдВ ├мn
рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рддреЛ рдореИрдВ рдПрдХрд╛рдзрд┐рдХ рдорд╛рдиреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреИрд╕реЗ рдХрд░реВрдВ?
рдкреБрдирд╢реНрдЪ: рдХреНрдпрд╛ рд╣рдо рдЗрд╕ рдЯрд┐рдХрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ?
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐
BaseCSVWidget.value_from_datadict
рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдордЬрдмреВрдд рдмрдирд╛рдиреЗ рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрдХреЗрд▓реЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдареАрдХ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛? (рдореИрдВ рдЕрднреА рддрдХ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛рдпрд╛ рд╣реВрдВред)
рд╕рдВрднрд╡рддрдГред рдпрджрд┐ рдорд╛рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕реВрдЪреА рд╣реИ, рддреЛ рдЙрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрд╕ рд╕реВрдЪреА рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╕реАрдПрд╕рд╡реА-рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ SelectMultiple
рд╡рд┐рдЬреЗрдЯ рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рд╣реИред
in
exact
рд╕реЗ рдЕрдзрд┐рдХ рдХреЗ рдХрдИ рдорд╛рдиреЛрдВ рдХреЗ рд╡рд┐рд░реБрджреНрдз рдЬрд╛рдБрдЪ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЕрдЧрд░ рдореИрдВ├мn
рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рддреЛ рдореИрдВ рдПрдХрд╛рдзрд┐рдХ рдорд╛рдиреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреИрд╕реЗ рдХрд░реВрдВ?
ModelMultipleChoiceFilter
Q рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд╕реЗ OR рдХреНрд╡реЗрд░реА рдмрдирд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ /api/mymodel?m2m=a&m2m=b
рдЬреИрд╕реА рдХреНрд╡реЗрд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ, рддреЛ рдЖрдк рдПрдХ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдВрдЧреЗ рдЬреИрд╕реЗ
MyModel.objects.filter(Q(m2m='a') | Q(m2m='b'))
2.1 рд░рд┐рд▓реАрдЬ рдХреЗ рд╕рд╛рде, lookup_expr
рдЕрдм рдкреНрд░рддреНрдпреЗрдХ Q рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдЧрд╛
MyModel.objects.filter(Q(m2m__in='a') | Q(m2m__in='b'))
рдЙрдкрд░реЛрдХреНрдд рдЕрдорд╛рдиреНрдп рд╣реИ рдФрд░ рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ contains
рдФрд░ рдЕрдиреНрдп рд▓реБрдХрдЕрдк рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдПрдХрд▓ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред
рддреЛ, рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЖрдкрдХреЛ рдпрд╣рд╛рдБ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ m2m рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП exact
рд▓реБрдХрдЕрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдБ рдЯреВрдбреВ рд╣реИ:
BaseCSVWidget
рдХреЛ SelectMultiple
рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдмрдирд╛рдПрдВред рдпрд╛ рдЕрдЧрд░ рдпрд╣ рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рд╣рдореЗрдВ рдХрдо рд╕реЗ рдХрдо init рдкрд░ рдПрдХ рдЙрдкрдпреЛрдЧреА рддреНрд░реБрдЯрд┐ рдкреНрд░рджрд╛рди рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПредMeta.fields
рдареАрдХ рдХрд░реЗрдВред in
рдХреЗ рд▓рд┐рдП ModelMultipleChoiceFilter
рдХрд╛ рд▓реБрдХрдЕрдк рдЬрдирд░реЗрдЯ рдХрд░рдирд╛ рдирд┐рд░рд░реНрдердХ рд╣реИред рд╣рдореЗрдВ рдпрд╣ рднреА рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ isnull
рдЬреИрд╕реЗ рдЕрдиреНрдп рд▓реБрдХрдЕрдк рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдмреВрд▓рд┐рдпрди рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИредрд╣рд╛рдБ, рдпрд╣ рдЕрднреА рднреА рдПрдХ рдмрдЧ рдХреА рддрд░рд╣ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреЗ рддрд╣рдд рд╣реИ ...
рдореЗрд░реЗ рдкрд╛рд╕ рдмрд╕ рдпрд╣ рддреНрд░реБрдЯрд┐ рдереА рдФрд░ рдЗрд╕рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рджрдмреА рд╣реБрдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рднрд╡рд┐рд╖реНрдп рдХреЗ рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рдВрдмреА рдЦреЛрдЬ рдХреЛ рдкреБрдирд░реНрдХрдерд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП:
рд╡реНрдпреВрд╕реЗрдЯ рдХреЗ filterset_fields
рдореЗрдВ рдШреЛрд╖рд┐рдд ManyToMany
рдлрд╝реАрд▓реНрдб рдореЗрдВ $#$ in
#$ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
рд░рдирдЯрд╛рдЗрдо рдкрд░ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдХреА рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреАред
@marcosox рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдПрдХ рдкреАрдЖрд░ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реБрдП рджреЗрдЦрдХрд░ рдЦреБрд╢реА рд╣реБрдИ!
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореЗрд░реЗ рдкрд╛рд╕ рдмрд╕ рдпрд╣ рддреНрд░реБрдЯрд┐ рдереА рдФрд░ рдЗрд╕рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рджрдмреА рд╣реБрдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рднрд╡рд┐рд╖реНрдп рдХреЗ рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рдВрдмреА рдЦреЛрдЬ рдХреЛ рдкреБрдирд░реНрдХрдерд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП:
рд╡реНрдпреВрд╕реЗрдЯ рдХреЗ
filterset_fields
рдореЗрдВ рдШреЛрд╖рд┐рддManyToMany
рдлрд╝реАрд▓реНрдб рдореЗрдВ $#$in
#$ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПрд░рдирдЯрд╛рдЗрдо рдкрд░ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдХреА рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреАред