[python] Django에서 동적 필드 조회로 QuerySet을 어떻게 필터링합니까?

주어진 수업 :

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')
  1. “검색”양식? 당신은 무엇을 할 것입니까? -이름 목록에서 이름을 선택 하시겠습니까? 작업 목록에서 작업을 선택 하시겠습니까? 개방형이지만 대부분의 사람들은이 혼란스럽고 사용하기 어렵다는 것을 알게됩니다.

    이러한 필터가있는 열은 몇 개입니까? 6? 12? 18?

    • 몇? 복잡한 선택 목록은 의미가 없습니다. 몇 가지 필드와 몇 가지 if 문이 의미가 있습니다.
    • 큰 수? 모델이 제대로 들리지 않습니다. “필드”는 실제로 열이 아닌 다른 테이블의 행에 대한 열쇠 인 것 같습니다.
  2. 특정 필터 버튼. 잠깐만 … Django 관리자가 작동하는 방식입니다. 특정 필터는 버튼으로 바뀝니다. 위와 동일한 분석이 적용됩니다. 몇 가지 필터가 의미가 있습니다. 많은 수의 필터는 일반적으로 일종의 첫 번째 일반 양식 위반을 의미합니다.

유사한 필드가 많으면 행이 많고 필드가 적어야한다는 것을 의미합니다.


답변