some weird query을 가졌으므로 원시 SQL을 실행해야합니다. 문제는이 쿼리가 점점 더 커지고 선택적 필터가 많이 필요하다는 것입니다 (순서, 열 기준 등). 주어진 그래서Django : RawQuerySet 필터
는이 쿼리 :
SELECT DISTINCT Camera.* FROM Camera c
INNER JOIN cameras_features fc1 ON c.id = fc1.camera_id AND fc1.feature_id = 1
INNER JOIN cameras_features fc2 ON c.id = fc2.camera_id AND fc2.feature_id = 2
이 대략 파이썬 코드입니다 : 이것은 큰 노력
def get_cameras(features):
query = "SELECT DISTINCT Camera.* FROM Camera c"
i = 1
for f in features:
alias_name = "fc%s" % i
query += "INNER JOIN cameras_features %s ON c.id = %s.camera_id AND %s.feature_id = " % (alias_name,alias_name,alias_name)
query += " %s "
i += 1
return Camera.objects.raw(query, tuple(features))
,하지만 난 예를 들어 가정, 이상의 필터 및 주문을 추가 할 필요가 색상별로 정렬하고 가격순으로 필터링해야하는데 성장하기 시작합니다.
#extra_filters is a list of tuples like:
# [('price', '=', '12'), ('color' = 'blue'), ('brand', 'like', 'lum%']
def get_cameras_big(features,extra_filters=None,order=None):
query = "SELECT DISTINCT Camera.* FROM Camera c"
i = 1
for f in features:
alias_name = "fc%s" % i
query += "INNER JOIN cameras_features %s ON c.id = %s.camera_id AND %s.feature_id = " % (alias_name,alias_name,alias_name)
query += " %s "
i += 1
if extra_filters:
query += " WHERE "
for ef in extra_filters:
query += "%s %s %s" % ef #not very safe, refactoring needed
if order:
query += "order by %s" % order
return Camera.objects.raw(query, tuple(features))
그래서 저는 h를 좋아하지 않습니다.
queryset = get_cameras(...)
queryset.filter(...)
queryset.order_by(...)
그러나이 작동하지 않습니다 흐름 그것은 내가 Model.objects.raw()
리턴한다 RawQuerySet을 알고, 그래서 내가 같은 것을 할 싶습니다 성장하기 시작했다. 물론 난 그냥 원시 쿼리를 수행 할 수있는 후 그 데이터와 함께 실제 QuerySet을 얻을하지만, 나는 두 가지 쿼리를 수행합니다. 마찬가지로 :
raw_query_set = get_cameras(...)
camera.objects.filter(id__in(raw_query_set.ids)) #don't know if it works, but you get the idea
은 내가 검색어 세트 초기화 또는 트릭을 할 수있는 캐시 뭔가를 생각하고 있어요,하지만 그것을 할 수 없었다.
? QuerySet도 점진적으로 생성 할 수 있습니다. – Kekoa