주어진 수업 :
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=20)
동적 인수를 기반으로 필터링하는 QuerySet을 가질 수 있습니까? 예를 들면 다음과 같습니다.
# Instead of:
Person.objects.filter(name__startswith='B')
# ... and:
Person.objects.filter(name__endswith='B')
# ... is there some way, given:
filter_by = '{0}__{1}'.format('name', 'startswith')
filter_value = 'B'
# ... that you can run the equivalent of this?
Person.objects.filter(filter_by=filter_value)
# ... which will throw an exception, since `filter_by` is not
# an attribute of `Person`.
답변
파이썬의 인수 확장은이 문제를 해결하기 위해 사용될 수 있습니다 :
kwargs = {
'{0}__{1}'.format('name', 'startswith'): 'A',
'{0}__{1}'.format('name', 'endswith'): 'Z'
}
Person.objects.filter(**kwargs)
이것은 매우 일반적이고 유용한 파이썬 관용구입니다.
답변
간단한 예 :
Django Survey 앱에서 등록 된 사용자를 표시하는 HTML 선택 목록을 원했습니다. 그러나 등록 된 사용자가 5000 명이므로 쿼리 기준 (예 : 특정 워크샵을 완료 한 사람)을 기준으로 목록을 필터링하는 방법이 필요했습니다. 설문 조사 요소를 재사용하려면 설문 조사 질문을 작성하는 사람이 해당 기준을 해당 질문에 첨부 할 수 있어야했습니다 (쿼리를 앱에 하드 코딩하고 싶지는 않음).
내가 생각해 낸 해결책은 100 % 사용자 친화적이지 않지만 (기술 담당자의 도움을 받아 쿼리를 작성해야 함) 문제를 해결합니다. 질문을 작성할 때 편집기는 다음과 같은 사용자 정의 필드에 사전을 입력 할 수 있습니다.
{'is_staff':True,'last_name__startswith':'A',}
해당 문자열은 데이터베이스에 저장됩니다. 뷰 코드에서는로 다시 나타납니다 self.question.custom_query
. 그 값은 사전처럼 보이는 문자열입니다 . eval () 을 사용하여 다시 실제 사전으로 바꾸고 ** kwargs를 사용하여 쿼리 세트에 넣습니다.
kwargs = eval(self.question.custom_query)
user_list = User.objects.filter(**kwargs).order_by("last_name")
답변
Django.db.models.Q 는 Django 방식으로 원하는 것입니다.
답변
매우 복잡한 검색 양식은 일반적으로 간단한 모델이 빠져 나 가려고한다는 것을 나타냅니다.
정확히 열 이름과 연산에 대한 값을 얻으려면 어떻게해야합니까? 어디의 값을받을 수 있나요 'name'
를 'startswith'
?
filter_by = '%s__%s' % ('name', 'startswith')
-
“검색”양식? 당신은 무엇을 할 것입니까? -이름 목록에서 이름을 선택 하시겠습니까? 작업 목록에서 작업을 선택 하시겠습니까? 개방형이지만 대부분의 사람들은이 혼란스럽고 사용하기 어렵다는 것을 알게됩니다.
이러한 필터가있는 열은 몇 개입니까? 6? 12? 18?
- 몇? 복잡한 선택 목록은 의미가 없습니다. 몇 가지 필드와 몇 가지 if 문이 의미가 있습니다.
- 큰 수? 모델이 제대로 들리지 않습니다. “필드”는 실제로 열이 아닌 다른 테이블의 행에 대한 열쇠 인 것 같습니다.
-
특정 필터 버튼. 잠깐만 … Django 관리자가 작동하는 방식입니다. 특정 필터는 버튼으로 바뀝니다. 위와 동일한 분석이 적용됩니다. 몇 가지 필터가 의미가 있습니다. 많은 수의 필터는 일반적으로 일종의 첫 번째 일반 양식 위반을 의미합니다.
유사한 필드가 많으면 행이 많고 필드가 적어야한다는 것을 의미합니다.