我有一个关于呈现虚构的简化城市的应用程序。
请考虑以下 Django 模型:
class City(models.Model):
name = models.CharField(...)
...
TYPEGROUP_CHOICES = (
(1, 'basic'),
(2, 'extra'),
)
class BldgType(models.Model):
name = models.CharField(...)
group = models.IntegerField(choices=TYPEGROUP_CHOICES)
class Building(models.Model):
created_at = models.DateTimeField(...)
city = models.ForeignKey(City)
type = models.ForeignKey(BldgType)
other_criterion = models.ForeignKey(...)
class Meta:
get_latest_by = 'created_at'
选择此设置的说明:
(1) 每个城市都有某些“基本”类型的建筑物,每个城市只出现一次(例如:市政厅、消防局、警察局、医院、学校),可能还有几十个“额外”类型的建筑物,例如舞蹈俱乐部。
(2) 在某些视图中,所有建筑物(无论城市等)都将根据不同的标准进行过滤,例如,other_criterion
。
问题/担忧:
在一个city_detail
视图中,我将不得不遍历任何“额外”类型的建筑物,这是正常的。
但是我不确定如何有效地检索城市的“医院”建筑,它是“基本”类型的,所以无论如何我必须为每个城市都这样做,因为每个城市都存在这样的医院(这是在城市创建时确保的) )。
最多会有十几种“基本”建筑类型,其中大约一半会一直呈现。
我倾向于在 City 模型上编写方便的方法,我面临三个选择:
(A1) 过孔try
和索引:.filter(...)[0]
(A2) 通过try
和.get(...)
(A3) 通过try
和.filter(...).latest()
但这些看起来都不优雅。或者这三个选项之一是否适合与某种缓存相结合,例如模型get_profile()
上的 Django 方法User
?不幸的是,我还没有缓存经验。
使用以下选项是不是很疯狂?
(B) 城市模型中的特定 FK,每个最重要的基本类型都有一个
问题:
哪个选项最有意义?
或者这种场景的模式通常是错误的?
特别是关于数据库性能,你有什么建议?我需要完全不同的方法吗?
请指教!:)
提前致谢!