【问题标题】:Django Admin interface with pickled set带有腌制集的 Django 管理界面
【发布时间】:2011-01-16 00:58:06
【问题描述】:

我有一个带有一组腌制字符串的模型。 (它必须被腌制,因为 Django 没有内置的 set 字段,对吧?)

class Foo(models.Model):

    __bar = models.TextField(default=lambda: cPickle.dumps(set()), primary_key=True)

    def get_bar(self):
        return cPickle.loads(str(self.__bar))

    def set_bar(self, values):
        self.__bar = cPickle.dumps(values)

    bar = property(get_bar, set_bar)

我希望该集合在管理界面中是可编辑的。显然,用户不会直接使用腌制字符串。此外,该界面还需要一个用于从集合中添加/删除字符串的小部件。

执行此操作的最佳方法是什么?我对 Django 的管理系统不是很熟悉。我是否需要构建自定义管理小部件或其他东西?

更新:如果我确实需要自定义小部件,这看起来很有帮助:http://www.fictitiousnonsense.com/archives/22

更新 2:现在我正在研究不同的关系模型,看看这是否可行。我正在玩弄的一个想法:

class FooMember(models.Model):
      name = models.CharField(max_length=120)
      foo = models.ForeignKey('Foo')

class Foo(models.Model):
      def get_names(self):
          return FooMember.objects.filter(foo__exact=self)

这样做的缺点包括:

  • 为一个数据字段 (name) 制作完整的模型感觉有些过头了。
  • 我希望Foo 的管理界面允许用户输入字符串列表。我不确定如何使用此设置进行操作;制作自定义表单小部件似乎少了一些工作。

【问题讨论】:

  • ManyToManyField 类似于集合。您能否在另一个模型中创建字符串 unique=True 字段,并将该模型的 ManyToManyField 包含在 Foo 中?
  • “为一个数据字段(名称)制作一个完整的模型感觉太过分了”——确实有这种感觉,但这些只是数据库表中的行。

标签: python django user-interface django-admin


【解决方案1】:

嗯。 Django 通常将其数据存储在 SQL 数据库中。将集合存储为腌制字符串绝对不是使用 SQL 数据库的最佳方式。在您的情况下,哪个是正确的解决方案并不是很明显,这取决于该集合中的内容,但无论如何这都是错误的解决方案。

您可能需要为该集合创建一个新表,或者至少将其保存为逗号分隔值或其他内容。

【讨论】:

  • 你能解释一下为什么这是错误的方法吗?该集合中的项目永远不会超过 10 个,因此我不需要快速查找时间。另外,CSV 比腌制有什么优势? (如果我腌制的物品不是一套,除了抱怨更多。)
  • CSV 的优点是即使没有 python 也可以阅读。如果你想要 pickles 中的所有内容,请尝试 ZODB,这是一个非常棒的基于 pickles 的面向对象的数据库。这是错误的方法,因为它确实使用了您拥有的 SQL 数据库,它不可移植,实现起来很复杂,它很脆弱并且容易损坏。根本没有什么引人注目的地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-08
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
相关资源
最近更新 更多