【问题标题】:Django: slow performance navigating generic foreign keysDjango:导航通用外键的性能缓慢
【发布时间】:2014-03-13 12:35:44
【问题描述】:

我的 Django 应用程序有一堆不同的 Widget 模型类。它们都继承自抽象模型BaseWidget,尽管它们有很多不同,但它们有一些共同的字段(例如pricename 等)。我还有一个Package 模型,它旨在表示一个有序的小部件集合(可能来自不同的类)以及一些元数据。这是一个示例包:

[<FooWidget: 4>, <BarWidget: 1>, <BarWidget: 5>, <BangWidget: 1>]

一个示例任务是总结一个包中所有小部件的price,或者以正确的顺序打印一个小部件列表。

目前,我的实现是每个Widget 都有一个指向Package 的ForeignKey。 Package 有一个GenericForeignKey 到第一个Widget,称为first_widget,每个Widget 都有一个GenericForeignKey,称为next_widget。为了遍历包的小部件,我遵循 next_widget 关系,就像链表一样。这很慢,我正在寻找更好的方法。

我的一个想法是在Package 上有一个名为widget_tuples 的字段,它是(WidgetClass, pk) 元组的列表。如果我能找到一种有效的方法来将此 Python 数据结构序列化/反序列化到我的数据库(例如通过酸洗),那么我可以通过以下方式重建列表:

widgets = [WidgetClass.objects.get(pk) for WidgetClass,pk in self.widget_tuples]

任何人都可以评论这种方法或指出更好的方向吗?

(顺便说一句,包中的小部件列表不会动态更改;即不添加或删除小部件。)

【问题讨论】:

  • 你能发布你的模型吗?有时答案是通过更改基本模型来简化问题。

标签: python database django django-models foreign-keys


【解决方案1】:

使用不同的类 - 不是好的解决方案。一个小部件 - 一个或多个查询。 我认为您需要一个 Widget 类和方法来序列化自定义小部件。 您还需要动态创建表单字段,例如来自 json 数据。在表单中 - 覆盖 is_valid 方法并将数据保存到 Widget 模型中。 对于 json,我推荐 ujson lib。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 2011-07-17
    • 2020-04-26
    • 1970-01-01
    • 2020-12-21
    相关资源
    最近更新 更多