如何在djcli中使用OR筛选器



在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
-----  ------------  ---------

但它没有显示如何使用OR过滤器,即列出具有is_staff=Trueis_superuser=True的用户,这可能吗?

否则,你建议如何为OR’ing过滤器提出语法,以便我可以为djcli做出贡献?

截至目前(30-11-2018 04:13 (UTC)(这是不可能的

为什么不可能
如果我们查看souce代码,他们使用了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.filter(**kwargs) # here the majot thing happens
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

它将把CCD_ 6作为CCD_。


如何在Django中执行OR过滤器
可以通过使用Q()|运算符来完成示例:

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



现在怎么办
解决方案-1.@schillingt所述,向他们的回购机构提出一张罚单或PR,以解决问题

解决方案-2.编辑源代码
创建一个新函数,ls_OR()作为


from django.db.models import Q

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)
or_filter = Q()
for key, value in kwargs.items():
or_filter |= Q(**{key: value})
models = model.objects.filter(or_filter)
if not models:
print('No result found !')
sys.exit(0)
_printqs(models, args)

现在尝试使用新命令ls_OR作为

djclils_ORsettings.AUTH_USER_MODEL is_superuser=True is_staff=1 username email is_superuser


解决方案-3。创建原始包的副本版本
我不确定许可证或leagel内容
第1步:克隆存储库
第2步:通过添加ls_OR功能编辑djcli.py文件,我在解决方案-2部分中提到了该功能:通过pip uninstall djcli从您的环境中卸载旧版本的djcli通过python setup.py install
第5步拥有djcli:开始使用ls_OR命令:(


结论
我推荐Solution-1。如果你赶时间,就去Solution-3

更新:@JPG是对的。我没有理解这个问题。我的错误答案:

我查看了他们的代码。这就像您想要筛选出要删除的对象一样。作为命名参数传递到命令行的所有参数都作为**kwargs传递到OR。

因此,只要您可以通过传递简单的关键字参数作为过滤器来满足查询,就可以过滤ls命令对象。

示例(我没有测试(:

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

但是对于您提到的字段,您可能会使用is_staff=1而不是is_staff=True,因为它在注释和文档中是这样的。

最新更新