Django:导航通用外键的性能缓慢

时间:2014-02-14 08:39:28

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

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

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

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

目前,我的实现是每个Widget都有一个到Package的ForeignKey。 PackageGenericForeignKey的{​​{1}} Widgetfirst_widgetWidget GenericForeignKey next_widget Package。为了遍历包的小部件,我遵循next_widget关系,就像链表一样。这非常缓慢,我正在寻找更好的方法。

我的一个想法是在名为widget_tuples的{​​{1}}上添加一个(WidgetClass, pk)元组列表。如果我能找到一种有效的方法来将这个Python数据结构序列化/反序列化到我的数据库中(例如通过pickle),那么我可以通过执行以下方式重建列表:

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

有人可以评论这种做法,还是指出我的方向更好?

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

1 个答案:

答案 0 :(得分:0)

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