在这个方法中如何传递参数?
Posted
技术标签:
【中文标题】在这个方法中如何传递参数?【英文标题】:How pass parameter in this method? 【发布时间】:2021-06-11 20:26:37 【问题描述】:您好,我是 Python 新手。
我现在学习 django 查询集。但是
query.pyi in _BaseQuerySet's method
def values(self, *fields: Union[str, Combinable], **expressions: Any) -> ValuesQuerySet[_T, Dict[str, Any]]: ...
我想向那个函数传递一个参数,但是第一个代码运行了,但是第二个代码没有运行。
这里是错误代码
valuelist = ("col1", "col2")
comment = Comment.objects.annotate(col1=F("contents"), col2=F("comment_depth")).values(valuelist)
如果上面的代码运行就会出现
Traceback (most recent call last):
File "D:\Ryan\conda\envs\djangostudy\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "D:\Ryan\conda\envs\djangostudy\lib\site-packages\django\core\handlers\base.py", line 179, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "D:\Ryan\conda\envs\djangostudy\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "D:\Ryan\conda\envs\djangostudy\lib\site-packages\rest_framework\viewsets.py", line 114, in view
return self.dispatch(request, *args, **kwargs)
File "D:\Ryan\conda\envs\djangostudy\lib\site-packages\rest_framework\views.py", line 505, in dispatch
response = self.handle_exception(exc)
File "D:\Ryan\conda\envs\djangostudy\lib\site-packages\rest_framework\views.py", line 465, in handle_exception
self.raise_uncaught_exception(exc)
File "D:\Ryan\conda\envs\djangostudy\lib\site-packages\rest_framework\views.py", line 476, in raise_uncaught_exception
raise exc
File "D:\Ryan\conda\envs\djangostudy\lib\site-packages\rest_framework\views.py", line 502, in dispatch
response = handler(request, *args, **kwargs)
File "D:\djangostudy\DjangoStudy\member\views.py", line 79, in memberlistrlist nt_depth")).values(valuelist)
comment = Comment.objects.annotate(col1=F("contents"), col2=F("commes\query.py", line 841, in valuesment_depth")).values(valuelist)
File "D:\Ryan\conda\envs\djangostudy\lib\site-packages\django\db\models\query.py", line 836, in _valuesels\query.py", line 841, in values
clone = self._values(*fields, **expressions)
File "D:\Ryan\conda\envs\djangostudy\lib\site-packages\django\db\models\query.py", line 836, in _values
clone.query.set_values(fields)
File "D:\Ryan\conda\envs\djangostudy\lib\site-packages\django\db\models\sql\query.py", line 2172, in set_values
self.add_fields(field_names, True)
File "D:\Ryan\conda\envs\djangostudy\lib\site-packages\django\db\models\sql\query.py", line 1863, in add_fields
join_info = self.setup_joins(name.split(LOOKUP_SEP), opts, alias, allow_many=allow_m2m)
ttributeError: 'tuple' object has no attribute 'split'
14/Mar/2021 19:14:09] "GET /member/memberlist/ HTTP/1.1" 500 116044
不是错误代码
comment = Comment.objects.annotate(col1=F("contents"), col2=F("comment_depth")).values("col1", "col2")
我应该怎么做才能让它正常运行?
【问题讨论】:
请不要发布代码、错误等图片。.values(*value_list)
带星号。
请复制代码片段,而不是图像的代码片段:idownvotedbecau.se/imageofcode
对不起,伙计们...我编辑了它
【参考方案1】:
错误出现在.values(…)
子句中:您不能将元组作为参数传递。您使用 iterable unpack 将可迭代的值解包为单独的参数。这是通过在前面加上一个星号 (*
) 来完成的:
Comment.objects.annotate(
col1=F('contents'),
col2=F('comment_depth')
).values(*valuelist)
话虽如此,与.values(…)
[Django-doc] 合作通常不是一个好主意,因为它会“侵蚀”模型层。
【讨论】:
为什么这段代码在 Django 模型部分解释不好?我只是,我只想通过以元组的形式定义几个列来保持简洁。 使用.values
意味着您不再使用Comment
对象,而是使用字典,这意味着您不再通过ForeignKey
s 获取对象、评估属性等:@ 987654322@以上是关于在这个方法中如何传递参数?的主要内容,如果未能解决你的问题,请参考以下文章