Есть несколько других вещей, о которых нужно подумать в этом сценарии, кроме просто сказать «Я хочу добавить кеширование».
Если вы работаете в Azure или в веб-ферме, вам нужен централизованный кеш (REDIS или тому подобное), так как кэш памяти будет уничтожен и воссоздан на вашем сайте, и локально для один сервер в ферме, поэтому вы не обязательно увидите прирост производительности.
Если вы настраиваете кэш REDIS, убедитесь, что вы позаботились о его настройке. Кодирование должно быть таким же, чтобы учесть соединения, и если вы сделаете это неправильно, вы в конечном итоге переполните свой пул соединений.
Это больше относится к вашей ситуации, но даже 4 секунды, чтобы вернуть 70 тыс. Записей, кажутся высокими. Проходили ли вы план выполнения, чтобы увидеть, есть ли отсутствующие индексы или оптимизации с CTE, которые можно применить?
Вы захотите использовать соглашение Django для соединения между отношениями , чтобы присоединиться к таблице группы в вашем наборе запросов.
Во-первых, я рекомендую указать вашим отношениям related_name
. Это делает код более читабельным, чем тот, который Django генерирует по умолчанию.
class Group(models.Model):
myuser = models.ForeignKey(User, related_name='groups')
Если вам нужна только одна группа, вы можете присоединиться к этой связи и сравнить поле имени, используя любой из следующих методов:
form.fields['myuser'].queryset = User.objects.filter(
groups__name='foo')
form.fields['myuser'].queryset = User.objects.filter(
groups__name__in=['foo'])
Если вы хотите квалифицировать несколько группы, используйте в предложении
:
form.fields['myuser'].queryset = User.objects.filter(
groups__name__in=['foo', 'bar'])
Если вы хотите быстро просмотреть сгенерированный SQL, вы можете сделать это:
qs = User.objects.filter(groups__name='foo')
print qs.query
Это действительно старый вопрос, но для тех, кто ищет ответ на этот вопрос (как и я), пожалуйста, знайте, что принятый ответ уже не на 100% правильный. Пользователь может принадлежать к нескольким группам, поэтому для правильной проверки того, входит ли пользователь в какую-либо группу, вы должны сделать следующее:
qs = User.objects.filter(groups__name__in=['foo'])
Конечно, если вы хотите проверить несколько групп, вы можете добавить их в список:
qs = User.objects.filter(groups__name__in=['foo', 'bar'])