我有郵政和標籤型號:Django的:優化多對多查詢
class Tag(models.Model):
""" Tag for blog entry """
title = models.CharField(max_length=255, unique=True)
class Post(models.Model):
""" Blog entry """
tags = models.ManyToManyField(Tag)
title = models.CharField(max_length=255)
text = models.TextField()
我需要輸出博客條目列表和一組對每個崗位的標籤。我希望能夠與剛剛兩個查詢要做到這一點,利用這種工作流程:
- 獲取帖子列表
- 獲取在這些職位中使用的標籤列表
- 鏈接標籤蟒蛇的職位
,這裏是我想出的代碼,但給了我'Tag' object has no attribute 'post__id'
#getting posts
posts = Post.objects.filter(published=True).order_by('-added')[:20]
#making a disc, like {5:<post>}
post_list = dict([(obj.id, obj) for obj in posts])
#gathering ids to list
id_list = [obj.id for obj in posts]
#tags used in given posts
objects = Tag.objects.select_related('post').filter(post__id__in=id_list)
relation_dict = {}
for obj in objects:
#Here I get: 'Tag' object has no attribute 'post__id'
relation_dict.setdefault(obj.post__id, []).append(obj)
for id, related_items in relation_dict.items():
post_list[id].tags = related_items
你能看到一個錯誤嗎?我如何使用django ORM來解決這個任務,或者我將不得不編寫一個自定義SQL?
編輯:
我能夠與原始查詢來解決這個問題:
objects = Tag.objects.raw("""
SELECT
bpt.post_id,
t.*
FROM
blogs_post_tags AS bpt,
blogs_tag AS t
WHERE
bpt.post_id IN (""" + ','.join(id_list) + """)
AND t.id = bpt.tag_id
""")
relation_dict = {}
for obj in objects:
relation_dict.setdefault(obj.post_id, []).append(obj)
我會greatfull的人誰將指向如何避免它。
Daniel Roseman在他的django高效項目中封裝了它:https://github.com/danielroseman/django-efficient – 2011-04-17 23:32:59
Django 1.2中沒有爲我工作。需要做到這一點:'Post.tags.through.objects.select_related('tag')...' – millerdev 2011-05-20 14:57:00
很好,先生! – rafek 2012-06-24 04:23:27