Как использовать OR фильтры в djcli? - PullRequest
0 голосов
/ 18 ноября 2018

В документации djcli они объясняют, что вы можете фильтровать такие модели с помощью команды list:

$ djcli ls settings.AUTH_USER_MODEL is_staff=1 username email is_superuser
Auto-detected DJANGO_SETTINGS_MODULE=testproj2.settings
Auto-detected model=auth.User
-----  ------------  ---------
email  is_superuser  username
       True          newb
       False         13337noob
-----  ------------  ---------

Но это не показывает, как использовать фильтр ИЛИ, т.е. перечислить пользователей, которые либо с is_staff=True, либо с is_superuser=True, это возможно?

В противном случае, как вы рекомендуете предлагать синтаксис для фильтров OR, чтобы я мог внести свой вклад в djcli?

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

На данный момент (30-11-2018 04:13 (UTC)) это невозможно.

Почему это невозможно?
Если мы посмотрим на исходный код , они использовали метод filter() для получения результатов.

def ls(modelname, *args, **kwargs):
    """Search models

    kwargs are passed to filter.
    It shows all fields by default, you can restrict them with args.

    Show username and email for superusers::

        djcli auth.user is_superuser=1 username email
    """

    model = _model_get(modelname)
    models = model.objects<b>.filter(**kwargs) # here the majot thing happens</b>
    if not models:
        print('No result found !')
        sys.exit(0)

    _printqs(models, args)

Итак, если вы выполните такую ​​команду,

djcli ls settings.AUTH_USER_MODEL is_superuser=True is_staff=1 username email is_superuser

он передаст is_superuser=True is_staff=1 в фильтр как kwargs, что приведет к фильтрации LOGICAL AND .


Как сделать OR фильтр в Django?
Это можно сделать с помощью оператора Q() и | Пример:

MyModel.model.objects.filter(Q(question__startswith='Who') | Q(question__startswith='What'))



Что теперь ??
Solution-1. Как упомянуто @ schillingt , поднять билет или PR для их репо, чтобы решить проблему

Solution-2. Редактирование исходного кода
создайте новую функцию, ls_OR() as,


<b>from django.db.models import Q</b>


def ls_OR(modelname, *args, **kwargs):
    """Search models

    kwargs are passed to filter in LOGICAL OR fashion.
    It shows all fields by default, you can restrict them with args.

    Show username and email for superusers::

        djcli auth.user is_superuser=1 username email
    """

    model = _model_get(modelname)
    <b>or_filter = Q()
    for key, value in kwargs.items():
        or_filter |= Q(**{key: value})
    models = model.objects.filter(or_filter)</b>
    if not models:
        print('No result found !')
        sys.exit(0)

    _printqs(models, args)

и теперь попробуйте с новой командой ls_OR как

djcli <b>ls_OR</b> settings.AUTH_USER_MODEL is_superuser=True is_staff=1 username email is_superuser


Solution-3. Создание копии оригинальной версии пакета
Я не уверен насчет Лицензии или продуктов Leagel.
Step-1 : клонировать репозиторий
Шаг-2 : отредактируйте файл djcli.py, добавив функцию ls_OR, о которой я упоминал в разделе Solution-2
Шаг-3 : удалите старую версию djcli из вашей среды с помощью pip uninstall djcli
Шаг-4 : установите наш djcli python setup.py install
Шаг-5 : начать использовать команду ls_OR :)


Заключение
Я бы порекомендовал Solution-1. Если вы спешите, перейдите на Solution-3.

0 голосов
/ 28 ноября 2018

Обновление: @JPG прав. Я не поняла вопрос. Мой неправильный ответ:

Я посмотрел на их код . Это как когда вы хотите отфильтровать объекты для удаления. Все, что вы передаете в качестве именованных аргументов в командную строку, передается в OR как **kwargs.

Таким образом, насколько вы можете удовлетворить свой запрос, передав в качестве фильтра простые аргументы ключевых слов, вы можете фильтровать ls объекты команд.

Пример (я не проверял):

$ djcli ls settings.AUTH_USER_MODEL email username username=1337noob

Но для упомянутых вами полей вы можете использовать is_staff=1 вместо is_staff=True, как в комментариях и документации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...