【发布时间】:2017-06-06 14:18:38
【问题描述】:
我有两个模型,模型 B 和模型 C,它们都扩展了模型 A。
在一个表单中,我有一个模型 A 的模型选择字段 - 这显然会加载模型 B 和 C 的所有实例,这是我的意图。
所以这个下拉列表超过 1000 个“A 对象”。我正在使用 hasattr() 来确定它们是 B 还是 C,然后使用这些类中的 unicode 方法从下拉列表中以字符串形式显示对象。
这会创建数千个 SQL 查询,大约需要一分钟的时间来处理。现在我的解决方案是查询数据库 3 次(获取所有 A、B 和 C 对象,然后遍历 A 并确定每个对象是 B 类型还是 C 类型,并将正确的 unicode 字符串推送到使用的列表中在下拉列表中。然后我清理数据并在保存表单时选择正确的对象。这是 hackey(对我来说)。
我想知道当该模型是其他模型的基本模型时,是否有人知道使用数千个模型对象选择填充下拉列表的有效方法。
干杯, 院长
【问题讨论】:
-
unicode 方法到底是做什么的?它们不应该引起额外的查询
-
B 或 C 的对象对其他模型具有外键字段。 - unicode 从这些其他模型中获取一个字段(self.foreign_key_field.field_to_print_out)。例如,单个对象是 B 类型(扩展 A),我想从 Model X 中打印出一个最能代表该对象的字段(并通过外键关联)。 select_related() 会在这里发挥作用吗? (ps。我是 Django 新手)
-
那是正确的,我已经重写了我的答案(因为原件是在一个漫长的星期六晚上写的并且完全不正确......)希望能解释 1k 查询的来源