Django Meta类ordering属性的两种赋值写法是否存在区别?
两段代码的核心差异
两段代码的本质区别是生成的ordering属性类型完全不同:
- 第一段代码:
ordering = tuple(('-pub_date',))最终得到的是单元素元组,值为('-pub_date',)。你写的内层结构('-pub_date',)末尾带了逗号,Python会直接识别为元组,外层的tuple()只是把已经是元组的结构再转一次元组,结果还是符合Django要求的序列类型,使用起来没有问题。 - 第二段代码:
ordering = ('-pub_date')最终得到的是字符串类型,值就是普通的'-pub_date'字符串。Python的语法规则里,单元素加括号但末尾不带逗号的话,括号只会被当成运算优先级的标识,不会用来构造元组,所以这段代码本质和ordering = '-pub_date'没有任何区别。
后续使用的影响也很明确:Django的Meta.ordering要求接收列表或者元组这类序列,用来指定一个或多个排序字段。如果传了字符串,Django遍历排序规则时会把字符串拆成单个字符逐个读取,完全找不到对应的模型字段,直接触发运行报错。
内容的提问来源于stack exchange,提问作者Qaimaq
相关产品推荐
相关产品推荐

