2014-04-22 1 views
0

태그가있는 간단한 블로그 앱이 있습니다.관련 필드를 가져올 때 쿼리 오버 헤드를 줄입니다.

class AbstractDate(models.Model): 
    created = models.DateTimeField(auto_now_add=True) 

    class Meta: 
     abstract = True 

class AbstractTitleData(AbstractDate): 
    title = models.CharField(max_length=200) 

    class Meta: 
     abstract = True 


class Post(AbstractTitleData): 
    body = models.TextField() 
    views = models.IntegerField(default=0) 
    likes = models.IntegerField(default=0) 
    picture = models.ImageField(upload_to='profile_images', blank=True) 


    class Meta: 
     ordering = ["-created"] 

    def __unicode__(self): 
     return self.title 

class Tag(models.Model): 
    slug = models.SlugField(max_length=15) 
    post = models.ForeignKey(Post, related_name="tags") 

    def __unicode__(self): 
     return self.slug 

예를 들어, 내 DB에는 두 개의 게시물이 있습니다. 'a', 'b', 'c'및 'd', 'e', ​​'f'태그가있는 게시물 A와 게시물 B가 있습니다. 데이터베이스에 대한 쿼리를 줄이기 위해 extra() 메서드를 사용하려고합니다.

condition = 'blog_post.id = blog_tag.post_id' 
p = Post.objects.all().extra(select={'t':'blog_tag.slug'},tables=["blog_tag"],where=[condition]) 

결과 : 내가 한 ATTR에 나열된 모든 태그, 그래서 등으로 각 게시물의 사본을 얻을 수있는 방법

[<Post: A>, <Post: A>, <Post: A>, <Post: B>, <Post: B>, <Post: B>] 
for post in p: print post.t 
'a' 
'b' 
'c' 
'd' 
'e' 
'f' 

:

p =[<Post: A>, <Post: B>] 
for post in p: print post.t 
['a','b','c'] 
['d','e','f'] 

답변

1

당신은 extra를 사용하지 것이다 그건 전혀. 대신, 두 개의 쿼리의 게시물과 모든 관련 태그를 가져 prefetch_related를 사용

p = Post.objects.all().prefetch_related('tag') 
+0

p = Post.objects.all(). prefetch_related ('tag')와 같은 조합을 사용할 수 있습니까? extra (select = { 'count': "select count (*) from blog_tag, blog_post 여기서 blog_post.id = blog_tag 추가 의견 blog_post.id "}에 의한 .post_id 그룹은 내가 이것에 대해 생각 필드 –

1

나는 당신이 당신의 태그 모델의 ForeignKey을 사용하려는 모르겠어요. Django에서 ForeignKey는 many-to-one이고 many-to-many 관계를 선호합니다. 즉, 하나의 게시물은 여러 개의 태그를 가질 수 있고 하나의 태그는 여러 개의 게시물을 나타낼 수 있습니다.

내가 select_related을 사용하고, 성능 문제를 처리하려면

은 자사의 쿼리를 실행하면 추가 관련 객체 데이터를 선택, 을 외래 키 관계를 "따라"하는 검색어 세트를 돌려줍니다. 이 하나 더 복잡한 쿼리 결과 만 데이터베이스 쿼리를 필요로하지 않습니다 외래 키 관계를 나중에 사용을 의미 성능 부스터입니다.

+0

들으을 계산,하지만 난이 문서에서이 예제를 보았다 https://docs.djangoproject.com/en/dev/ref/models/fields/# django.db.models.ForeignKey.related_query_name는. 그러나 지금은 슈어, 다 대다가 최선의 방법 –

0

django-taggit을 사용해 보셨습니까? 그것은 당신의 인생을 더 쉽게 만들 수 있습니다. 플러그를 꽂으면됩니다. 이 문서에는 사용자가 원할 수도있는 몇 가지 예제 쿼리가 있습니다.

+0

들으, 나는이 응용 프로그램에 대해 알고 있지만, 장고의 이해와 몇 가지 테스트에 있음 작업을 사용할 필요가 자신의 태그. –