Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Django管理中限制选择的数量

如何在Django管理中限制选择的数量
EN

Stack Overflow用户
提问于 2017-10-04 04:18:48
回答 2查看 1.6K关注 0票数 1

假设我有两个模型,GroupPerson,其中GroupPerson的外键字段。在管理页面中,Group表示为Person admin的下拉/选择字段。现在,我希望选择的数量限制在,比如说五个,并且应该根据它们的name来排序。

目前,我有以下代码:

代码语言:javascript
运行
AI代码解释
复制
class PersonAdmin(admin.ModelAdmin):
    form = PersonAdminForm
    ...
    def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
        if db_field.name == 'group':
            kwargs['queryset'] = Group.objects.all().order_by('name')[:5]

        return super(PersonAdmin, self).formfield_for_foreignkey(
            db_field, request, **kwargs)

class PersonAdminForm(forms.ModelForm):
    class Meta:
        model = Person

问题是,当我试图保存对象时,我会得到以下错误:AssertionError: Cannot filter a query once a slice has been taken.

我搜索了这个错误,发现了很多这样的线程,但它们似乎都没有对我的情况有所帮助。

下面是完整的堆栈跟踪:

代码语言:javascript
运行
AI代码解释
复制
Traceback (most recent call last):
  File "/home/man/.virtualenvs/foo/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 111, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/man/.virtualenvs/foo/local/lib/python2.7/site-packages/django/contrib/admin/options.py", line 583, in wrapper
    return self.admin_site.admin_view(view)(*args, **kwargs)
  File "/home/man/.virtualenvs/foo/local/lib/python2.7/site-packages/django/utils/decorators.py", line 105, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "/home/man/.virtualenvs/foo/local/lib/python2.7/site-packages/django/views/decorators/cache.py", line 52, in _wrapped_view_func
    response = view_func(request, *args, **kwargs)
  File "/home/man/.virtualenvs/foo/local/lib/python2.7/site-packages/django/contrib/admin/sites.py", line 206, in inner
    return view(request, *args, **kwargs)
  File "/home/man/.virtualenvs/foo/local/lib/python2.7/site-packages/django/contrib/admin/options.py", line 1453, in add_view
    return self.changeform_view(request, None, form_url, extra_context)
  File "/home/man/.virtualenvs/foo/local/lib/python2.7/site-packages/django/utils/decorators.py", line 29, in _wrapper
    return bound_func(*args, **kwargs)
  File "/home/man/.virtualenvs/foo/local/lib/python2.7/site-packages/django/utils/decorators.py", line 105, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "/home/man/.virtualenvs/foo/local/lib/python2.7/site-packages/django/utils/decorators.py", line 25, in bound_func
    return func.__get__(self, type(self))(*args2, **kwargs2)
  File "/home/man/.virtualenvs/foo/local/lib/python2.7/site-packages/django/db/transaction.py", line 394, in inner
    return func(*args, **kwargs)
  File "/home/man/.virtualenvs/foo/local/lib/python2.7/site-packages/django/contrib/admin/options.py", line 1396, in changeform_view
    if form.is_valid():
  File "/home/man/.virtualenvs/foo/local/lib/python2.7/site-packages/django/forms/forms.py", line 162, in is_valid
    return self.is_bound and not bool(self.errors)
  File "/home/man/.virtualenvs/foo/local/lib/python2.7/site-packages/django/forms/forms.py", line 154, in errors
    self.full_clean()
  File "/home/man/.virtualenvs/foo/local/lib/python2.7/site-packages/django/forms/forms.py", line 353, in full_clean
    self._clean_fields()
  File "/home/man/.virtualenvs/foo/local/lib/python2.7/site-packages/django/forms/forms.py", line 368, in _clean_fields
    value = field.clean(value)
  File "/home/man/.virtualenvs/foo/local/lib/python2.7/site-packages/django/forms/fields.py", line 150, in clean
    value = self.to_python(value)
  File "/home/man/.virtualenvs/foo/local/lib/python2.7/site-packages/django/forms/models.py", line 1185, in to_python
    value = self.queryset.get(**{key: value})
  File "/home/man/.virtualenvs/foo/local/lib/python2.7/site-packages/django/db/models/query.py", line 345, in get
    clone = self.filter(*args, **kwargs)
  File "/home/man/.virtualenvs/foo/local/lib/python2.7/site-packages/django/db/models/query.py", line 691, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "/home/man/.virtualenvs/foo/local/lib/python2.7/site-packages/django/db/models/query.py", line 703, in _filter_or_exclude
    "Cannot filter a query once a slice has been taken."
AssertionError: Cannot filter a query once a slice has been taken.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-04 04:21:40

您可以在init方法中修改queryset,找到前五个组ids,然后通过__in查找在pk上进行筛选。

代码语言:javascript
运行
AI代码解释
复制
class PersonAdminForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(PersonAdminForm, self).__init__(*args, **kwargs)
        group_ids = Group.objects.all().order_by('name').values_list('pk', flat=True)[:5]
        self.fields['group'].queryset = Group.objects.filter(pk__in=group_ids).order_by('name')

    group = forms.ModelChoiceField(queryset=None, empty_label=None)

    class Meta:
        model = Person
        fields = '__all__'
票数 2
EN

Stack Overflow用户

发布于 2017-10-04 06:20:56

为了避免过滤切片查询集的错误,您可能需要获取前五个组,然后使用__in查找创建第二个查询集。很讨厌,但我认为它会成功的。

代码语言:javascript
运行
AI代码解释
复制
first_five = list(Group.objects.all().order_by('name')[:5].values('pk', flat=True))
queryset = Group.objects.filter(id__in=first_five).order_by('name')[:5]

如果您已经有了一个自定义模型表单,那么我认为这段代码最干净的地方应该是表单的__init__方法,而不是重写formfield_for_foreignkey

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46564705

复制
相关文章
Android:支持单选,多选,还可以限制选择的数量的流式布局
由于开发需要,需要做一个效果,一个流式布局的标签,可多选,并且要限制选择的数量,在查找了许多大神写的代码后,决定用鸿洋大神写的一个框架.
程思扬
2022/01/10
9990
linux中修改打开文件的数量限制
在 Linux中你可以更改打开文件的最大数量。你可以使用ulimit命令。它使你能够控制可用于 shell 或由它启动的进程的资源。 查找 Linux 打开文件限制 # cat /proc/sys/fs/file-max 365004 该值表示每次登录会话可以打开的文件数。不同系统结果可能会有所不同。 例如在一个 CentOS 我的服务器,限制设置为 365004 在 Linux 中检查硬限制 # ulimit -Hn 65535 检查 Linux 中的软限制 # ulimit -Sn 65535
入门笔记
2022/06/02
3.6K0
WordPress 技巧:限制分类数量
如果你和我一样,使用 WordPress MU 做一个平台,比如我做的花生小店,需要限制每个博客的商品分类的数量:
Denis
2023/04/14
6750
WordPress 技巧:限制分类数量
WordPress 技巧:限制文章数量
如果你和我一样,使用 WordPress MU 做一个平台,比如我做的花生小店,需要限制每个博客的商品数量:
Denis
2023/04/14
7270
WordPress 技巧:限制文章数量
WordPress 技巧:限制素材数量
WordPress 后台限制系列最后一篇,限制图片素材的数量,废话不多说,直接上代码:
Denis
2023/04/14
9540
WordPress 技巧:限制素材数量
go语言限制Goroutine数量
package main import ( _ "ORMTest/routers" "fmt" "runtime" "time" ) func main() { runtime.GOMAXPROCS(runtime.NumCPU()) c := make(chan bool, 100) t := time.Tick(time.Second) go func() { for { select { case <-t: watching() } }
IT工作者
2021/12/24
7790
解除飞young宽带设备数量的限制
首先感谢cj大佬 的开源,吃水不忘挖井人 很多学校都有校园网需要拿账号去登陆或者限制流量或者限制时间才能畅游internet这就很烦,俗话说上有政策下有对策,大家也想了很多的办法来解决这些限制。诸如:绕端口,扫账号,克隆mac利用路由器固件等等! 今天我就要给大家介绍一个针对破解飞young设备限制方法极其简单,这样一个宿舍都可以用了。可以平摊网费剩下一笔巨款。废话不多说我们进入正题。
用户7146828
2021/08/09
6K0
如何选择线程数量
👨‍💻个人主页: 才疏学浅的木子 🙇‍♂️ 本人也在学习阶段如若发现问题,请告知非常感谢 🙇‍♂️ 📒 本文来自专栏: 面试 🌈 每日一语:人的一生,好不好只有自己知道,乐不乐只有自己明白。 🌈 本文目录 CPU密集型 IO密集型 选择线程数量 区别 总结 CPU密集型 CPU密集型 又叫做计算密集型,系统运作大部分是CPU Loading,CPU密集就是该任务需要大量的运算,而没有阻塞,CPU一直全速运行 IO密集型 IO密集型指的是在系统运行过程中,大部分的状况是CPU在等I/O的读
才疏学浅的木子
2022/11/13
7320
如何在容器中避免CPU瓶颈限制
在 Uber,所有有状态的工作负载都运行在一个跨大型主机的通用容器化平台上。有状态工作负载包括 MySQL®、Apache Cassandra®、ElasticSearch®、Apache Kafka®、Apache HDFS™、Redis™、Docstore、Schemaless 等,并且在许多情况下,这些工作负载位于同一物理主机上。
从大数据到人工智能
2022/03/30
1.4K0
如何在容器中避免CPU瓶颈限制
日期时间限制的选择
对于elementUI一些拿来即用的组件,虽然是可以直接用,但仍需要针对自己的业务做一些特殊处理
itclanCoder
2021/11/18
3.2K0
Django 限制访问频率
最近做了一个系统由于部分接口需要进行耗时操作,因而不希望用户进行频繁访问,需要进行访问频率限制。如果要自己实现一个访问限制功能相对来说也不会太复杂,并且网上有各种代码可以参考。如果自己不想实现这个代码可以使用 Django Ratelimit 。
obaby
2023/02/24
1.4K0
Python 限制线程的最大数量(Sem
import threading import time sem=threading.Semaphore(4) #限制线程的最大数量为4个 def gothread(): with sem: #锁定线程的最大数量 for i in range(8): print(threading.current_thread().name,i) time.sleep(1) for i in range(5): threading.
py3study
2020/01/06
2.4K0
团队如何限制合适的在制品(WIP)数量
看板之父David Anderson曾说过“看板的本质是一个很朴素的思想:在制品必须被限制。”但对于团队来说,确定一个合适的在制品限制可能是件棘手的事。
敏捷开发
2022/05/05
2.1K0
团队如何限制合适的在制品(WIP)数量
Django(23)Django限制请求装饰器
有时候,我们想要限制访问的请求方法,比如我们希望用户只能通过get方式请求,post不允许,那么我们可以采用装饰器的方式,django已经为我们提供了内置的装饰器
全栈程序员站长
2022/09/16
7020
如何在django中设置定时任务?
Django 作为后端Web开发框架,有时候我们需要用到定时任务来或者固定频次的任务来执行某段代码,这时我们就要用到Celery了。Django中有一个中间件:Django-celery
BigYoung小站
2020/05/04
3K0
再谈《Django 限制访问频率》
之前提到使用ratelimit来限制访问频率,我的目的是根据用户来限制访问频率,但是实际上通过下面的代码并没有达到效果,如果用多个浏览器进行同时刷新,会存在跳过限制的情况
obaby
2023/02/24
1K0
点击加载更多

相似问题

限制django管理中的对象数量

23

Django管理-限制下拉列表中的选择

20

Django管理-限制ForeignKey字段的选择

11

限制django每个用户管理的django选择字段

14

Django管理中的限制/筛选外键选择

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档