在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=True
或is_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
,因为它在注释和文档中是这样的。