我的Django应用程序有许多不同的Widget
模型类。它们都继承自抽象模型BaseWidget
,尽管存在许多差异,但它们有一些共同的字段(例如price
,name
等)。我还有一个Package
模型,用于表示有序的小部件集合(可能来自不同的类),以及一些元数据。这是一个示例包:
[<FooWidget: 4>, <BarWidget: 1>, <BarWidget: 5>, <BangWidget: 1>]
示例任务是汇总包中所有小部件的price
,或者以正确的顺序打印小部件列表。
目前,我的实现是每个Widget
都有一个到Package
的ForeignKey。 Package
对GenericForeignKey
的{{1}} Widget
有first_widget
,Widget
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]
有人可以评论这种做法,还是指出我的方向更好?
(顺便说一下,包中的小部件列表不会动态改变;即不添加或删除小部件。)
答案 0 :(得分:0)
使用不同的类 - 不是很好的解决方案。一个小部件 - 一个或多个查询。 我认为你需要一个Widget类和序列化自定义小部件的方法。 您还需要动态表单字段创建,例如从json数据创建。在表单中 - 覆盖is_valid方法并将数据保存到Widget模型中。 对于json我推荐ujson lib。