используя set вместо list в django и проверяя id с каждым id в списке - PullRequest
0 голосов
/ 06 февраля 2020
def user(request):
  users_list = UserConfig.objects.get(meta_key="ALLOWED_USERS")
  users_list = [int(x) for x in user_list.meta_value.split(",")]
  if request.user.id not in users_list:
   // some logic
  else: 
    // other logic

Как я могу преобразовать приведенный выше фрагмент с помощью набора, в настоящее время я использую список для проверки. Поэтому, если объект получает больше, он не будет эффективным способом.

Использование Django 1,8

Любая помощь приветствуется

Ответы [ 4 ]

3 голосов
/ 06 февраля 2020

Как я могу преобразовать приведенный выше фрагмент с помощью набора

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

users_set = set(int(x) for x in user_list.meta_value.split(","))

НО ваша реальная проблема здесь Это проблема дизайна - вы НЕ должны хранить список связанных pks (вы не должны хранить какой-либо список FWIW) в одном поле. Либо используйте существующие функции auth.User, либо используйте разрешения, либо используйте пользовательскую модель пользователя и добавьте в нее свои собственные вещи и т. Д. c, но во что бы то ни стало сохраняйте свою реляционную схему должным образом нормализованной. Мои 2 цента ...

1 голос
/ 06 февраля 2020

Я знаю, что это не прямой ответ на ваш вопрос, но если вы должны использовать эту модель как есть, и вам нужен более быстрый поиск, я думаю, что вы можете использовать динамический шаблон регулярного выражения c, чтобы определить, является ли идентификатор пользователя в этом списке:


import re
def user(request):
    users_list = UserConfig.objects.get(meta_key="ALLOWED_USERS")
    pattern = "{0},".format(request.user.id)
    if re.search(pattern, users_list):
        # User is in list
    else:
        # User not in list

Это просто идея, и предполагается, что ваша строка имеет каждый идентификатор, за которым следует запятая, включая последнюю.

1 голос
/ 06 февраля 2020

Хотя наборы имеют намного более быстрое время поиска по сравнению со списками, они не сохраняют порядок данных. Так что просто знайте об этом при принятии решения, какую структуру данных использовать.

def user(request):
    users_list = UserConfig.objects.get(meta_key="ALLOWED_USERS")
    users_list = [int(x) for x in user_list.meta_value.split(",")]
    user_set = set(users_list)
    if request.user.id not in users_set:
        // some logic
    else: 
        // other logic
1 голос
/ 06 февраля 2020

Вы можете создать set из списка.

users_list = UserConfig.objects.get(meta_key="ALLOWED_USERS")
users_list = [int(x) for x in user_list.meta_value.split(",")]
users_list = <b>set(users_list)</b>

Вы также можете использовать Установить понимание.

users_list = {int(x) for x in user_list.meta_value.split(",")}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...