【问题标题】:django error, "The QuerySet value for an exact lookup must be limited to one result using slicing"django 错误,“精确查找的 QuerySet 值必须限制为使用切片的一个结果”
【发布时间】:2021-02-23 11:21:50
【问题描述】:

当我使用 csv 文件中的数据创建对象时出现错误,错误是:

“精确查找的 QuerySet 值必须使用切片限制为一个结果。”

它似乎来自 get_or_create 行。我试图对函数中的所有查询集进行切片,但这并没有解决问题。而且我已经知道所有模型字段都存在并且我的models.py是正确的

            contracts = Contract.objects.filter(contract_id=row[2])
            if not contracts:  
                continue

            new_contract = contracts.first()

            logger.info(new_contract.contract_id)

            _, created = Job.objects.get_or_create(contract=new_contract, 
                                                   order_type = str(row[3])[:0], 
                                                   description_of_works  = str(row[4]), 
                                                   added_on = date_time_obj,
                                                   date_raised = date_time_obj,
                                                   draughtsman = base_user.objects.filter(first_name__icontains=issuer_str[0:4]),
                                                   status = job_status, #IDFK
                                                   comment = str(row[8]),
                                                   design_required = design_req,
                                                   designer = str(row[10])).first() 

我检查了同一主题的其他问题,但他们没有任何解决方案。 任何帮助表示赞赏。

编辑: 这是容器的回溯

web_1 | Traceback (most recent call last):

web_1 | File "/usr/local/lib/python3.9/site-packages/asgiref/sync.py", line 339, in thread_handler

web_1 | raise exc_info[1]

web_1 | File "/usr/local/lib/python3.9/site-packages/django/core/handlers/exception.py", line 38, in inner

web_1 | response = await get_response(request)

web_1 | File "/usr/local/lib/python3.9/site-packages/django/core/handlers/base.py", line 233, in _get_response_async

web_1 | response = await wrapped_callback(request, *callback_args, **callback_kwargs)

web_1 | File "/usr/local/lib/python3.9/site-packages/asgiref/sync.py", line 304, in __call__

web_1 | ret = await asyncio.wait_for(future, timeout=None)

web_1 | File "/usr/local/lib/python3.9/asyncio/tasks.py", line 442, in wait_for

web_1 | return await fut

web_1 | File "/usr/local/lib/python3.9/site-packages/asgiref/current_thread_executor.py", line 23, in run

web_1 | result = self.fn(*self.args, **self.kwargs)

web_1 | File "/usr/local/lib/python3.9/site-packages/asgiref/sync.py", line 343, in thread_handler

web_1 | return func(*args, **kwargs)

web_1 | File "./Trackers_App/views.py", line 224, in test_zone

web_1 | import_csv()

web_1 | File "./Trackers_App/views.py", line 1747, in import_csv

web_1 | _, created = Job.objects.get_or_create(contract=new_contract,

web_1 | File "/usr/local/lib/python3.9/site-packages/django/db/models/manager.py", line 85, in manager_method

web_1 | return getattr(self.get_queryset(), name)(*args, **kwargs)

web_1 | File "/usr/local/lib/python3.9/site-packages/django/db/models/query.py", line 573, in get_or_create

web_1 | return self.get(**kwargs), False

web_1 | File "/usr/local/lib/python3.9/site-packages/django/db/models/query.py", line 425, in get

web_1 | num = len(clone)

web_1 | File "/usr/local/lib/python3.9/site-packages/django/db/models/query.py", line 269, in __len__

web_1 | self._fetch_all()

web_1 | File "/usr/local/lib/python3.9/site-packages/django/db/models/query.py", line 1308, in _fetch_all

web_1 | self._result_cache = list(self._iterable_class(self))

web_1 | File "/usr/local/lib/python3.9/site-packages/django/db/models/query.py", line 53, in __iter__

web_1 | results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)

web_1 | File "/usr/local/lib/python3.9/site-packages/cachalot/monkey_patch.py", line 29, in inner

web_1 | return original(compiler, *args, **kwargs)

web_1 | File "/usr/local/lib/python3.9/site-packages/cachalot/monkey_patch.py", line 79, in inner

web_1 | cache_key = cachalot_settings.CACHALOT_QUERY_KEYGEN(compiler)

web_1 | File "/usr/local/lib/python3.9/site-packages/cachalot/utils.py", line 76, in get_query_cache_key

web_1 | sql, params = compiler.as_sql()

web_1 | File "/usr/local/lib/python3.9/site-packages/django/db/models/sql/compiler.py", line 513, in as_sql

web_1 | where, w_params = self.compile(self.where) if self.where is not None else ("", [])

web_1 | File "/usr/local/lib/python3.9/site-packages/django/db/models/sql/compiler.py", line 430, in compile

web_1 | sql, params = node.as_sql(self, self.connection)

web_1 | File "/usr/local/lib/python3.9/site-packages/django/db/models/sql/where.py", line 81, in as_sql

web_1 | sql, params = compiler.compile(child)

web_1 | File "/usr/local/lib/python3.9/site-packages/django/db/models/sql/compiler.py", line 430, in compile

web_1 | sql, params = node.as_sql(self, self.connection)

web_1 | File "/usr/local/lib/python3.9/site-packages/django/db/models/fields/related_lookups.py", line 132, in as_sql

web_1 | return super().as_sql(compiler, connection)

web_1 | File "/usr/local/lib/python3.9/site-packages/django/db/models/lookups.py", line 302, in as_sql

web_1 | return super().as_sql(compiler, connection)

web_1 | File "/usr/local/lib/python3.9/site-packages/django/db/models/lookups.py", line 181, in as_sql

web_1 | rhs_sql, rhs_params = self.process_rhs(compiler, connection)

web_1 | File "/usr/local/lib/python3.9/site-packages/django/db/models/lookups.py", line 284, in process_rhs

web_1 | raise ValueError(

web_1 | ValueError: The QuerySet value for an exact lookup must be limited to one result using slicing.

web_1 | 2021-02-23 11:15:29,536 ERROR Internal Server Error: /trackers/test_zone/

web_1 | Traceback (most recent call last):

web_1 | File "/usr/local/lib/python3.9/site-packages/asgiref/sync.py", line 339, in thread_handler

web_1 | raise exc_info[1]

web_1 | File "/usr/local/lib/python3.9/site-packages/django/core/handlers/exception.py", line 38, in inner

web_1 | response = await get_response(request)

web_1 | File "/usr/local/lib/python3.9/site-packages/django/core/handlers/base.py", line 233, in _get_response_async

web_1 | response = await wrapped_callback(request, *callback_args, **callback_kwargs)

web_1 | File "/usr/local/lib/python3.9/site-packages/asgiref/sync.py", line 304, in __call__

web_1 | ret = await asyncio.wait_for(future, timeout=None)

web_1 | File "/usr/local/lib/python3.9/asyncio/tasks.py", line 442, in wait_for

web_1 | return await fut

web_1 | File "/usr/local/lib/python3.9/site-packages/asgiref/current_thread_executor.py", line 23, in run

web_1 | result = self.fn(*self.args, **self.kwargs)

web_1 | File "/usr/local/lib/python3.9/site-packages/asgiref/sync.py", line 343, in thread_handler

web_1 | return func(*args, **kwargs)

web_1 | File "./Trackers_App/views.py", line 224, in test_zone

web_1 | import_csv()

web_1 | File "./Trackers_App/views.py", line 1747, in import_csv

web_1 | _, created = Job.objects.get_or_create(contract=new_contract,

web_1 | File "/usr/local/lib/python3.9/site-packages/django/db/models/manager.py", line 85, in manager_method

web_1 | return getattr(self.get_queryset(), name)(*args, **kwargs)

web_1 | File "/usr/local/lib/python3.9/site-packages/django/db/models/query.py", line 573, in get_or_create

web_1 | return self.get(**kwargs), False

web_1 | File "/usr/local/lib/python3.9/site-packages/django/db/models/query.py", line 425, in get

web_1 | num = len(clone)

web_1 | File "/usr/local/lib/python3.9/site-packages/django/db/models/query.py", line 269, in __len__

web_1 | self._fetch_all()

web_1 | File "/usr/local/lib/python3.9/site-packages/django/db/models/query.py", line 1308, in _fetch_all

web_1 | self._result_cache = list(self._iterable_class(self))

web_1 | File "/usr/local/lib/python3.9/site-packages/django/db/models/query.py", line 53, in __iter__

web_1 | results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)

web_1 | File "/usr/local/lib/python3.9/site-packages/cachalot/monkey_patch.py", line 29, in inner

web_1 | return original(compiler, *args, **kwargs)

web_1 | File "/usr/local/lib/python3.9/site-packages/cachalot/monkey_patch.py", line 79, in inner

web_1 | cache_key = cachalot_settings.CACHALOT_QUERY_KEYGEN(compiler)

web_1 | File "/usr/local/lib/python3.9/site-packages/cachalot/utils.py", line 76, in get_query_cache_key

web_1 | sql, params = compiler.as_sql()

web_1 | File "/usr/local/lib/python3.9/site-packages/django/db/models/sql/compiler.py", line 513, in as_sql

web_1 | where, w_params = self.compile(self.where) if self.where is not None else ("", [])

web_1 | File "/usr/local/lib/python3.9/site-packages/django/db/models/sql/compiler.py", line 430, in compile

web_1 | sql, params = node.as_sql(self, self.connection)

web_1 | File "/usr/local/lib/python3.9/site-packages/django/db/models/sql/where.py", line 81, in as_sql

web_1 | sql, params = compiler.compile(child)

web_1 | File "/usr/local/lib/python3.9/site-packages/django/db/models/sql/compiler.py", line 430, in compile

web_1 | sql, params = node.as_sql(self, self.connection)

web_1 | File "/usr/local/lib/python3.9/site-packages/django/db/models/fields/related_lookups.py", line 132, in as_sql

web_1 | return super().as_sql(compiler, connection)

web_1 | File "/usr/local/lib/python3.9/site-packages/django/db/models/lookups.py", line 302, in as_sql

web_1 | return super().as_sql(compiler, connection)

web_1 | File "/usr/local/lib/python3.9/site-packages/django/db/models/lookups.py", line 181, in as_sql

web_1 | rhs_sql, rhs_params = self.process_rhs(compiler, connection)

web_1 | File "/usr/local/lib/python3.9/site-packages/django/db/models/lookups.py", line 284, in process_rhs

web_1 | raise ValueError(

web_1 | ValueError: The QuerySet value for an exact lookup must be limited to one result using slicing.

【问题讨论】:

  • draughtsman = base_user.objects.filter(first_name__icontains=issuer_str[0:4]) 是罪魁祸首,因为那是一个QuerySet,所以是一个集合,而不是一个单个 base_user 对象。
  • 解决了,您能否将此评论作为答案,以便我可以将其标记为已解决,谢谢

标签: django django-models


【解决方案1】:

罪魁祸首是这条线:

    draughtsman = base_user.objects.<b>filter(</b>first_name__icontains=issuer_str[0:4]<b>)</b>,

是罪魁祸首,因为那是一个QuerySet,所以是一个集合,而不是一个单个 base_user 对象。您可以使用.get(…) [Django-doc] 或使用.first() [Django-doc] 来获取对象(两者并不完全等价,更多信息请访问文档)。

因此你应该传递一个base_userobject,例如:

    draughtsman = base_user.objects.<b>get(</b>first_name__icontains=issuer_str[0:4]<b>)</b>,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-02
    • 1970-01-01
    • 2020-05-05
    • 2019-05-26
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 2020-11-13
    相关资源
    最近更新 更多