Django: Как отфильтровать Пользователей, которые принадлежат определенной группе

Есть несколько других вещей, о которых нужно подумать в этом сценарии, кроме просто сказать «Я хочу добавить кеширование».

  1. Если вы работаете в Azure или в веб-ферме, вам нужен централизованный кеш (REDIS или тому подобное), так как кэш памяти будет уничтожен и воссоздан на вашем сайте, и локально для один сервер в ферме, поэтому вы не обязательно увидите прирост производительности.

  2. Если вы настраиваете кэш REDIS, убедитесь, что вы позаботились о его настройке. Кодирование должно быть таким же, чтобы учесть соединения, и если вы сделаете это неправильно, вы в конечном итоге переполните свой пул соединений.

  3. Это больше относится к вашей ситуации, но даже 4 секунды, чтобы вернуть 70 тыс. Записей, кажутся высокими. Проходили ли вы план выполнения, чтобы увидеть, есть ли отсутствующие индексы или оптимизации с CTE, которые можно применить?

31
задан Sardorbek Imomaliev 14 November 2019 в 08:17
поделиться

2 ответа

Вы захотите использовать соглашение 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 
50
ответ дан 27 November 2019 в 22:01
поделиться

Это действительно старый вопрос, но для тех, кто ищет ответ на этот вопрос (как и я), пожалуйста, знайте, что принятый ответ уже не на 100% правильный. Пользователь может принадлежать к нескольким группам, поэтому для правильной проверки того, входит ли пользователь в какую-либо группу, вы должны сделать следующее:

qs = User.objects.filter(groups__name__in=['foo'])

Конечно, если вы хотите проверить несколько групп, вы можете добавить их в список:

qs = User.objects.filter(groups__name__in=['foo', 'bar'])
16
ответ дан Martin Tschammer 27 November 2019 в 22:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: