2009-10-27 1 views
0

에서 나는이 내 아바타 응용 프로그램에서 나에게 32 개 아바타 이미지를 얻을 수 쿼리 :체인 쿼리 함께 장고

newUserAv = Avatar.objects.filter(valid=True)[:32] 

내가의 인증 사용자 모델을 장고하는 쿼리와이 결합하고 싶습니다, 그래서 얻을 수 있습니다 마지막으로 아바타 이미지를 가지고있는 마지막 32 명이 가입 날짜로 정렬됩니다.

이 두 가지를 함께 묶는 가장 좋은 방법은 무엇입니까?

아바타 응용 프로그램은 재사용 가능한 응용 프로그램, 그리고 그 모델은 다음과 같습니다

image = models.ImageField(upload_to="avatars/%Y/%b/%d", storage=storage) 
user = models.ForeignKey(User) 
date = models.DateTimeField(auto_now_add=True) 
valid = models.BooleanField() 

날짜 필드가, 아바타가 업데이트 된 날짜가 있습니다, 그래서 내 purporse에 적합하지

+0

아바타 모델은 사용자 모델과 어떤 연관이 있습니까? –

+0

사용자 모델을 기본 키로 사용합니다. (문법이 틀리면 죄송합니다. 여기에서 배우고 있습니다) –

+0

원래 게시물을 'Avatar' 모델 코드로 업데이트 할 수 있습니까? – thornomad

답변

2

사용자가 하위 클래스를 가지고 있거나 django.contrib.auth.models.User으로 작성해야하는 사용자 클래스에 필드를 추가하여 사용자에게 아바타가 있음을 나타냅니다. 쿼리를 쉽게 작성할 수 있습니다. 그런

또는 할 일이 :

from django.utils.itercompat import groupby 
avatars = Avatar.objects.select_related("user").filter(valid=True).order_by("-user__date_joined")[:32] 
grouped_users = groupby(avatars, lambda x: x.user) 
user_list = [] 
for user, avatar_list in grouped_users: 
    user.avatar = list(avatar_list)[0] 
    user_list.append(user) 
# user_list is now what you asked for in the first_place: 
# a list of users with their avatars 

이 한 사용자가 오직 하나의 아바타를 가지고 있다고 가정합니다. 귀하의 모델은 사용자 당 하나 이상의 아바타를 허용하므로 하나 이상의 아바타를주의하지 않으면 안됩니다.

코드 조각에 대한 설명 : 최근에 가입 한 사용자 수가 32 명인 아바타는 관련 사용자와 함께 요청되므로 향후 코드에서 해당 사용자에 대한 데이터베이스 쿼리가 필요하지 않습니다. 그러면 아바타 목록이 사용자와 함께 키로 그룹화됩니다.

for avatar in avatars: 
    user = avatar.user 

그러나 다음 list 발전기 avatar_list과 첫 번째 항목 (하나만이 있어야한다)이 필요하지 않다고 user.avatar

주에 할당 된 모든 항목을 얻을, 당신은 항상 뭔가를 할 수 사용자에 의해 아바타에보다 자연스럽게 접근 할 수 있습니다. 아바타.

+0

Stefanw -이게 정말 맛있어 보인다. 나는 그것을 시도 할 것이다. 코드에 몇 가지 코멘트를 추가 할 수 있기를 바란다. –

+0

이것은 완벽하게 (그냥 테스트 한 것) 작동하지만 코드를 더 잘 이해하고 싶습니다. –

+0

약간의 설명을 추가했습니다. – stefanw

0

이 아니다 두 개의 서로 다른 기본 모델에서 쿼리를 결합 할 수 있습니다. 장고는 이것을하지 못하게 할 것입니다 (정확히 말하면 오류가 발생할 것입니다).

그러나 하나의 모델에서 다른 모델로 외래 키가있는 경우 쿼리에 select_related()를 추가하면 관련 개체가 단일 DB 쿼리로 메모리로 가져와 DB로 돌아 가지 않고 액세스 할 수 있습니다 .

+0

안녕하세요 Gabriel, 잘 모르겠습니다. 예를 들어 내 사용자 모델을 쿼리하는 방법 (모든 사용자를 쿼리하면 마지막 32 개로 제한 한 것처럼 일부는 아바타 개체가 없을 수 있습니다) - 그런 다음 전달하십시오. 날짜가 합산 된 날짜까지 모든 사용자에 대한 쿼리를 수행하는 것이 약간 비효율적입니까? –