django 쿼리에서 조회 필드 이름을 동적으로 제공하는 방법은 무엇입니까? [복제하다

StackOverflow https://stackoverflow.com/questions/1227091

  •  22-07-2019
  •  | 
  •  

문제

이 질문은 이미 여기에 답이 있습니다.

Django의 모델의 여러 필드에서 특정 문자열을 찾고 싶습니다. 이상적으로는 다음과 비슷한 점이 있습니다.

keyword = 'keyword'
fields = ['foo', 'bar', 'baz']
results = []
for field in fields:
    lookup = "%s__contains"
    results.append(Item.objects.filter(lookup=keyword))

물론 "조회"를 필드로 해결할 수 없기 때문에 이것은 작동하지 않습니다. 이것을 할 다른 방법이 있습니까?

도움이 되었습니까?

해결책

Django 쿼리 시스템을 사용하여 더 나은 방법이있을 수 있다고 생각합니다. 당신의 길을하는 방법은 다음과 같습니다.

Python을 사용하면 사전을 전달하여 **로 접두사를 접두사로 인수 목록으로 사용할 수 있습니다. 운이 좋으면 다음과 같은 일을 할 수 있어야합니다.

lookup = "%s__contains" % field
results.append(Item.objects.filter(**{ lookup: keyword}))

다른 팁

나는 이와 같은 것에 Q 객체를 사용하는 것을 선호합니다.

from django.db.models import Q

keyword = 'keyword'
fields = ['foo', 'bar', 'baz']

Qr = None
for field in fields:
    q = Q(**{"%s__contains" % field: keyword })
    if Qr:
        Qr = Qr | q # or & for filtering
    else:
        Qr = q

# this you can now combine with other filters, exclude etc.    
results = MyModel.objects.filter(Qr)

Dialz의 답변이 마음에 들지만 성능의 이유로 모든 결과를 목록에 연결하는 대신 쿼리를 작성한 다음 데이터베이스를 한 번 누르야합니다.

keyword = 'keyword'
fields = ['foo', 'bar', 'baz']

# this makes an empty queryset object which we can
# add to later using the | operator
results = Item.objects.none()

for field in fields:
    lookup = "%s__contains" % field
    query = {lookup : keyword}
    results = results | Item.objects.filter(**query)

나는 한동안이 중 하나를하지 않았지만 Django 가이 코드에서 실제로 데이터베이스를 전혀 치지 않을 것이라고 확신합니다. 레코드에 포함 된 데이터에 액세스 할 때만 쿼리를 수행합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top