如何创建自定义字段的查询集?

2024-03-29 08:01:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个自定义字段,如下图所示。在

当用户发出GET请求时,我想在右边的列表中显示用户的权限。在左列表中,我想显示右列表中还没有的可用权限。如何对我的自定义字段进行正确的查询?我很困惑。在

这就是我认为我需要为available_permissions字段创建queryset的方法。伪代码:

for available_permission in Permission.objects.all()
   if available_permission not in (QuerySet <user_permissions>)
       Create new QuerySet with available_permission

1)如何知道用户权限?我想在这里我需要把用户id从视图发送到表单。在

2)如何创建空查询集并将对象添加到该查询集?在

表单.py:

^{pr2}$

视图.py:

class UserEditView(UpdateView):
    template_name = 'users/edit_user.html'
    form_class = UserEditForm
    model = User

    def get(self, request, *args, **kwargs):
        user = User.objects.get(pk=self.kwargs['pk'])
        context = {
        'user': user,
        'user_edit_form': UserEditForm(
            instance=user,
            current_permissions=user.get_all_permissions(),
            available_permissions=Permission.objects.difference(user.user_permissions.all()),
        ),
        }
        ***

enter image description here

错误:

Traceback (most recent call last):
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/views/generic/base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/views/generic/base.py", line 88, in dispatch
    return handler(request, *args, **kwargs)
  File "/Applications/Projects/web/dashboard.kase.kz/users/views.py", line 75, in get
    data['html_form'] = render_to_string('users/edit_user.html', context, request=request)
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/loader.py", line 68, in render_to_string
    return template.render(context, request)
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/backends/django.py", line 66, in render
    return self.template.render(context)
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/base.py", line 207, in render
    return self._render(context)
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/base.py", line 199, in _render
    return self.nodelist.render(context)
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/base.py", line 990, in render
    bit = node.render_annotated(context)
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/base.py", line 957, in render_annotated
    return self.render(context)
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/template/defaulttags.py", line 173, in render
    len_values = len(values)
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/forms/boundfield.py", line 71, in __len__
    return len(self.subwidgets)
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/utils/functional.py", line 35, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/forms/boundfield.py", line 57, in subwidgets
    for widget in self.field.widget.subwidgets(self.html_name, self.value(), attrs=attrs)
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/forms/boundfield.py", line 56, in <genexpr>
    BoundWidget(self.field.widget, widget, self.form.renderer)
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/forms/widgets.py", line 561, in subwidgets
    for option in self.options(name, value, attrs):
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/forms/widgets.py", line 566, in options
    for group in self.optgroups(name, value, attrs):
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/forms/widgets.py", line 575, in optgroups
    for index, (option_value, option_label) in enumerate(chain(self.choices)):
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/forms/models.py", line 1139, in __iter__
    for obj in queryset:
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/db/models/query.py", line 53, in __iter__
    results = compiler.execute_sql(chunked_fetch=self.chunked_fetch)
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 871, in execute_sql
    sql, params = self.as_sql()
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/db/backends/oracle/compiler.py", line 21, in as_sql
    with_col_aliases=with_col_aliases,
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 430, in as_sql
    result, params = self.get_combinator_sql(combinator, self.query.combinator_all)
  File "/Users/nurzhan_nogerbek/Virtualenvs/py2714/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 389, in get_combinator_sql
    raise DatabaseError('ORDER BY not allowed in subqueries of compound statements.')
DatabaseError: ORDER BY not allowed in subqueries of compound statements.

联合表单.py:

final_available_permissions = Permission.objects.none()
for available_permission in Permission.objects.all():
   if available_permission not in self.current_permissions:
      final_available_permissions = final_available_permissions.union(available_permission)
self.fields['available_permissions'].queryset = final_available_permissions

错误联合:

AttributeError: 'Permission' object has no attribute '_combinator_query'

Tags: djangoinpyselflibpackageslinesite
1条回答
网友
1楼 · 发布于 2024-03-29 08:01:14

您可以通过user.user_permissions.all()获得用户的权限,通过Permission.objects.difference(user.user_permissions.all())获得相反的权限。但是如果你同时考虑到组权限,你就必须做一些更复杂的事情。在

另一种解决方案,因为安装程序中的QuerySet.difference()有问题。在

current_permissions = Permission.objects.filter(user=user)
available_permissions = Permission.objects.exclude(user=user)

相关问题 更多 >