django模板中的复杂查询

django模板中的复杂查询,django,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 = Me

我有一个模型:

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。这会降低应用程序的性能。 在不同的数据库中有“用户”和“消息”表。 如何提高应用程序的性能?
谢谢。

您应该将其放在一个数据库中或使用缓存,但无法减少查询


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

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

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

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

如果将主查询保留在模板之外并保留在viewcode中,则可能会给自己带来更多的灵活性。至于数据库设计,在一个fetch中有许多消息,其中有许多用户的名称存储在另一个数据库中。。。。考虑反义化,并在消息中输入用户名。以后可能需要在名称更改时更新它们。为什么不在
用户
上使用
选择相关的
?JL,您的想法非常方便。本项目有8000个用户+50-100个用户/天。如果用户自己更改用户名怎么办?
for message in message_list:
    message.thread = threads.get(message.thread_id)
    message.user = users.get(message.user_id)