我有两个模型,模型 B 和模型 C,它们都扩展了模型 A。
在一个表单中,我有一个模型 A 的模型选择字段 - 这显然加载了模型 B 和 C 的所有实例,这是我的意图。
所以这个下拉列表有超过 1000 个“A 对象”。我正在使用 hasattr() 来确定它们是 B 还是 C,然后使用这些类中的 unicode 方法在下拉列表中以字符串形式显示对象。
这会创建数千个 SQL 查询,大约需要一分钟的时间来处理。现在我的解决方案是查询数据库 3 次(以获取所有 A、B 和 C 对象,然后遍历 A 并确定每个对象是否属于 B 或 C 类型,并将正确的 unicode 字符串插入使用的列表中在下拉列表中。然后我清理数据并在保存表单时选择正确的对象。这就是 hackey(对我来说)。
我想知道当该模型是其他模型的基础模型时,是否有人知道用数千个模型对象选项填充下拉列表的有效方法。
干杯, 院长
最佳答案
unicode gets a field from these other models (self.foreign_key_field.field_to_print_out).
这是进行其他查询的地方,而不是来自对 unicode 的调用或检查它是 a b 还是 a c。
如果您的 unicode 方法仅引用本地字段,这就不是问题,但正如您所注意到的,需要连接的字段不会自动完成,以节省一些甚至可能不需要的事情的性能。
如果你使用 django-debug-toolbar,你应该注意到 1000 个查询是相关对象的检索,而不是对象列表。
是的,正如您所指出的,select_related
在这里会有所帮助,因为这是您告诉 django 您确实需要这些字段。
关于python - 具有数千个选择的 Django 选择字段创建数以千计的数据库查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41783198/