我有模特:
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。这会降低应用程序的性能。
有桌子"用户"和"消息"在不同的数据库中。
如何提高应用程序的性能?
感谢。
答案 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 中预取用户,但我不确定这是不是一个好主意。这简直就是糟糕的设计。