django模板中的复杂查询

时间:2015-10-10 16:16:30

标签: django

我有模特:

class Message(models.Model):
    text = models.TextField()
    thread = models.ForeignKey(Thread)
    @property
    def user(self):
        return Users.objects.using('second_db').get(pk=self.sender)

在模板中:

{% comment %}
    message_list = Message.objects.all().select_related("thread")
{% endcomment %}

{% for message in message_list %}
   {{ message.text }}
   {{ message.thread.name }}
   {{ message.user.name }}
{% endfor %}

{{ message.user.name }}生成查询sql。这会降低应用程序的性能。 有桌子"用户"和"消息"在不同的数据库中。 如何提高应用程序的性能? 感谢。

2 个答案:

答案 0 :(得分:2)

手动预取相关数据(来自N + 1 - > 3次查询)。

thread_ids = [message.thread_id for message in message_list]
user_ids = [message.user_id for message in message_list]

users = {u.id: u for u in User.objects.filter(id__in=user_ids)}
threads = {t.id for t in Thread.objects.filter(id__in=thread_ids)}

然后你可以将用户和线程dicts传递给你的模板,或者循环传递消息并手动附加它们

for message in message_list:
    message.thread = threads.get(message.thread_id)
    message.user = users.get(message.user_id)

答案 1 :(得分:0)

那么你应该在一个数据库中使用它或使用缓存,但是你无法减少查询。

我可能会选择缓存。您也可以以某种方式在 init 中预取用户,但我不确定这是不是一个好主意。这简直就是糟糕的设计。