【问题标题】:Why Django's ModelAdmin uses lists over tuples and vice-versa为什么 Django 的 ModelAdmin 使用列表而不是元组,反之亦然
【发布时间】:2010-09-08 20:02:18
【问题描述】:

来自 Django 介绍教程,在\mysite\polls\admin.py

from django.contrib import admin
#...
class PollAdmin(admin.ModelAdmin):
  #...
  inlines = [ChoiceInline]
  list_display = ('question', 'pub_date', 'was_published_today')
  list_filter = ['pub_date']

admin.site.register(Poll, PollAdmin)

为什么 inlines 和 list_filter 都使用列表,而 list_display 使用元组? inlines 和 list_filters 是否出于某种原因需要可变?

我只是想了解这里的设计决策。

【问题讨论】:

  • 真的,我正在寻找一种合乎逻辑的方法来记住属性是列表还是元组。

标签: python django


【解决方案1】:

使用哪个并不重要,因为 Django(和您)永远不会在运行时更改它们。重要的是该值是字符串的可迭代对象。当只有一个元素时,我经常使用foo = ["something"],因为当我不小心说foo = ("somthing") 而不是foo = ("something",) 时,我经常被钉死。

我会将这个单元素元组表示法问题放在我的 Python 刺激物列表中,就在“重要空白”之后。也就是说,我仍然喜欢这种语言。

【讨论】:

  • 已验证。列表或元组都可以在这里使用——它可以双向工作。如果你尝试其他数据类型,你会得到类似这样的错误:'PollAdmin.list_filter' must be a list or tuple.
  • 我要列出清单。在我看来,元组应该用于具有自然结构的数据(这就是为什么它们是不可变的......有点)。使用元组来获取不可变列表对我来说似乎是错误的:o 在元组与列表上查看此答案stackoverflow.com/questions/626759/…
  • 我刚刚阅读了来自@pghalliday 的链接,发现元组和列表具有不同的含义(除了不可变之外)。我的理解是,inlines 的内容是自定义内联类,list_filter 的内容是“list_display 中定义的字段”。由于这些值都是“相同的”,因此它们是列表。但是,list_display 可以包含 (a) 模型的字段 (b) 管理员的字段(即在您的自定义管理类中定义的额外字段)。它们是不同的,例如,模型的字段是可排序的,但管理员的自定义字段不能(您会在管理页面上注意到它)。
  • afternerd.com/blog/difference-between-list-tuple 这是一篇讨论列表和元组性能的长文。由于这些字段在管理员中是“只读”的,因此在列表上使用元组似乎更好,即使只有一个对象。所以,我检查了django.contrib.auth.admin.py,发现它总是使用元组。
  • @JohnPang:我知道性能差异。这更多地与老化的大脑有关(现在比我的原始帖子大 8.5 岁),它在 Python 中有 2 个 主要 问题:“有意义的空白”和单元素元组语法。这个问题一直存在到今天,参考Python 3.7 docs
猜你喜欢
  • 2017-04-09
  • 2014-02-24
  • 2015-03-01
  • 2013-10-25
  • 2018-06-09
  • 1970-01-01
  • 2010-11-14
  • 2011-12-07
  • 2011-12-28
相关资源
最近更新 更多