2009-08-19 5 views
1

기본적으로 외래 키가 많은 테이블이 있는데 "만든"필드로 특정 키의 첫 번째 항목 만 쿼리하려고합니다. Blog/Entry 예제를 사용하여 Entry 모델에 Blog에 대한 외래 키와 User에 대한 외래 키가있는 경우 특정 사용자가 다양한 블로그에 대해 첫 번째로 작성한 모든 항목을 선택하는 쿼리를 작성하려면 어떻게해야합니까?열에 외래 키가 처음 나타나는 것을 장고 쿼리로 만들려면 어떻게해야합니까?

class Blog(models.Model): 
    ... 

class User(models.Model): 
    ... 

class Entry(models.Model): 
    blog = models.Foreignkey(Blog) 
    user = models.Foreignkey(User) 

내가 거기에 내가 블로그의 첫 번째 항목을 선택 누락 마법이야 내가 할 수있는 간단한 필터 더 아래 특정 사용자에 추가하여 가정 :

query = Entry.objects.magicquery.filter(user=user) 

을하지만 어쩌면 거기에 몇 가지 다른보다 효율적인 방법. 감사!

답변

1

query = Entry.objects.filter(user=user).order_by('id')[0]

(최고에 낮은) ID로

기본적으로 순서와 검색어 세트에서 첫 번째 히트를 얻기 위해 그것을 슬라이스. 그런데

order by

limiting querysets

:

나는 장고가 나는 종류 이상이 든 경우 그래서 설명서를 확인하시기 바랍니다 내 라인을 테스트하기 위해 지금 사용할 수 설치할 필요가 없습니다 , '제한 큐 세트'매뉴얼 섹션의 흥미로운 노트 :

리보다 st (예 : SELECT foo FROM bar LIMIT 1) 대신에 슬라이스 이라는 간단한 색인을 사용하십시오. 예를 들어,이 헤드 라인 알파벳 순으로 주문 항목 후, 데이터베이스에 첫 번째 항목을 반환

Entry.objects.order_by('headline')[0]

편집 : 좋아,이 네 이후 (내가 지금까지 올 수있는 최선입니다 그리고 내 의견). Entry 개체는 반환하지 않지만 ID는 entry_id으로 반환합니다.

query = Entry.objects.values('blog').filter(user=user).annotate(Count('blog')).annotate(entry_id=Min('id'))

나는 더 나은 방법을 찾고하겠습니다.

+0

에서 테스트 할 수 없습니다. 그래서 한도는 사용자가 작성한 첫 번째 항목 만 보여줍니다. 나는 사용자가 쓴 모든 항목을 잡을 수 있기를 원합니다.이 항목은 블로그의 첫 번째 항목입니다. –

+0

내 대답은이 경우에는 작동하지 않으며 queryset 메서드로만 작동하는 작업을 수행 할 수 없습니다 ... values ​​() 및 annotate()가 예상대로 작동하지 않으며 장고의 ORM으로 작동한다는 것을 알고있는 원시 SQL을 변환 할 수 없습니다. 죄송합니다 :( – inerte

0

내가 사용자가 여러 블로그를 위해 쓸 수 있다는 것을 언급해야이 특정 순간

Entry.objects.filter(user=user).distinct("blog").order_by("id")