首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应用于queryset的list类的count()方法。奇怪的行为。姜戈

应用于queryset的list类的count()方法。奇怪的行为。姜戈
EN

Stack Overflow用户
提问于 2019-05-25 16:49:01
回答 1查看 87关注 0票数 0

找不出为什么我一直在跟踪以下错误:

TypeError at / were /reversion/ count()采用一个位置参数,但给出了2个位置参数

代码语言:javascript
复制
#views
…
…
…

memory_limiter = BoatImage.objects.filter(boat_id__isnull=True).exclude(
    memory__in=existing_boats_pk).values_list("memory", flat=True)

for i in memory_limiter:
    if memory_limiter.count(i)  >  3:
        memory_limiter.remove(i)

shell是如何描述内存限制器的:

代码语言:javascript
复制
>>> for memory in memory_limiter:
...     print(memory, type(memory))
...
93 <class 'int'>
93 <class 'int'>
93 <class 'int'>
93 <class 'int'>
93 <class 'int'>
93 <class 'int'>
93 <class 'int'>
100 <class 'int'>
102 <class 'int'>
102 <class 'int'>
102 <class 'int'>
>>> memory_limiter
<QuerySet [93, 93, 93, 93, 93, 93, 93, 100, 102, 102, 102]>
>>>

以下方法也得到了同样的结果:

代码语言:javascript
复制
for i in [ x for x in memory_limiter]:
    if memory_limiter.count(i) > 3:
        memory_limiter.remove(i)

问题是伯爵有什么问题?我把这个列表复制到一个单独的*.py模块上,在那里它可以很好地工作…。试图将qs转换为迭代器-same结果。

在单独模块中

代码语言:javascript
复制
a = [93, 93, 93, 93, 93, 93, 93, 100, 102, 102, 102]

for i in a:
    if a.count(i) > 3:
        a.remove(i)
print(a)

----- >[93, 93, 93, 100, 102, 102, 102]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-25 16:57:18

这里没什么不对劲的。

代码语言:javascript
复制
memory_limiter = BoatImage.objects.filter(boat_id__isnull=True).exclude(
    memory__in=existing_boats_pk).values_list("memory", flat=True) # This returns QuerySet object.

for i in memory_limiter:
    # QuerySet class has instance method .count(), but you can not provide parameters. Also, QuerySet does not support remove() method.
    # if memory_limiter.count(i)  >  3:
    print(memory_limiter.count())

您的代码在list上工作。但是Django的QuerySet和python的list是不同的对象,有着不同的方法。

但你可以做这样的事。这应该有效(国际水文学组织)。

代码语言:javascript
复制
memory_limiter = list(BoatImage.objects.filter(boat_id__isnull=True).exclude(
        memory__in=existing_boats_pk).values_list("memory", flat=True)) # You should cast QuerySet object into list, then you can operate over it as a normal python's list.
for i in memory_limiter:
    if memory_limiter.count(i)  >  3:
        memory_limiter.remove(i)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56306867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档