在这个方法中如何传递参数?

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 对象,而是使用字典,这意味着您不再通过ForeignKeys 获取对象、评估属性等:@ 987654322@

以上是关于在这个方法中如何传递参数?的主要内容,如果未能解决你的问题,请参考以下文章

RN 如何给页面传参数

如何在Scala中添加另一个参数时传递可变参数?

如何将多个参数作为数组传递给 ruby​​ 方法?

参数传递

java中,如何用POST方法将参数传递给第三方网站

http地址中如何加参数and传递form表单中的参数