count () метод класса списка, примененного к запросу. Странное поведение. Джанго - PullRequest
0 голосов
/ 25 мая 2019

Не могу узнать, почему я продолжаю получать следующую ошибку:

Ошибка типа в / boats / reversion / count () принимает 1 позиционный аргумент, но 2 были даны

#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)

что говорит оболочка об ограничителе памяти:


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

следующий метод дает те же результаты:


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

Вопрос в том, что не так с количеством?Я скопировал и вставил этот список в отдельный модуль *.py, и там он работает нормально… Попытался превратить qs в одинаковые результаты итератора.

в отдельном модуле

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]

1 Ответ

2 голосов
/ 25 мая 2019

Здесь нет ничего плохого в django.

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 - это разные объекты с разными методами.

Но вы можете сделать что-то подобное.Это должно работать (ИМХО).

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...