2016-09-21 3 views
0

나는 django 1.10.1, postgres 9.5 및 redis를 사용합니다. 나는 사용자 표를 저장하고처럼 보이는 테이블이 있습니다데이터베이스 투표 테이블로의 이동 횟수를 최소화하려고 시도했습니다.

========================== 
object | user | created_on 
========================== 

objectuser가 자신의 테이블의 id 열에 외래 키는 각각됩니다.

문제는 많은 경우 한 페이지에 여러 개체를 나열해야한다는 것입니다. 사용자가 로그인하거나 인증 된 경우 모든 객체에 대해 투표 여부를 확인해야합니다 (결과에 따라 표시, vote 또는 unvote 버튼 표시). 그래서 내 템플릿에서 페이지의 모든 객체에 대해 이러한 함수를 호출해야합니다. 내가 한 페이지에서 객체의 수만을 가질 수 있기 때문에

def is_obj_voted(obj_id, usr_id): 
    return ObjVotes.objects.filter(object_id=obj_id, user_id=usr_id).exists() 

는, 나는 각 쿼리에 대해 하나의 행에 액세스하기 때문에 혼자 데이터베이스 액세스를 1 초 이상 걸릴 수 있다는 django-debug-toolbar를 사용하여 발견하고는 직렬에서 발생 페이지의 모든 개체에 대해 더 악화시키기 위해 다른 페이지의 해당 테이블에서 유사한 검색어를 사용합니다 (예 : user 또는 object 만 사용하는 필터).

달성하고자하는 것은 올바른 일이라고 생각하는 것은 데이터베이스에 한 번만 액세스하여 일부 사용자가 필터링 한 모든 객체를 가져 오는 방법을 찾는 것입니다 (사용자가 로그인하거나 그런 데이터베이스 액세스를 필요로하는 첫 페이지 히트시), 페이지 요구에 따라 원하는대로 추가로 필터링하십시오. 내가 redis를 사용하고 django-cacheops 앱을 사용 했으므로 그 일을 도와 줄 수 있습니까? 귀하의 경우에는 내가 더 잘 개체 ID의 배열을 얻고 사용자의 ID로 모든 표 및이 배열, 뭔가 같은 쿼리와 함께 가고 싶어에서

+0

어떻게 object_ids를 얻었습니까? 코드의 해당 부분으로 업데이트하십시오. redis와 django-cache는 어디에 위치합니까? – e4c5

답변

0

는 :

object_ids = [o.id for o in Object.objects.filter(YOUR CONDITIONS)] 
votes = set([v.object_id for v in ObjVotes.objects.filter(object_id__in=object_ids, user_id=usr_id)] 
def is_obj_voted(obj_id, votes): 
    return obj_id in votes 

이 얻기를위한 단 하나의 추가 데이터베이스 쿼리를 만들 것입니다 페이지 당 사용자별로 득표합니다.

+1

효율적으로 pks를 가져 오려면'queryset.values_list ('pk', flat = True)'를 사용해야합니다. – Suor