0

我有一个关于呈现虚构的简化城市的应用程序。

请考虑以下 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,每个最重要的基本类型都有一个

问题:

哪个选项最有意义?
或者这种场景的模式通常是错误的?

特别是关于数据库性能,你有什么建议?我需要完全不同的方法吗?

请指教!:)

提前致谢!

4

2 回答 2

1

如果一个城市只能有市政厅、消防局、警察局、医院、学校等各一个,那么我认为最直接的执行方法是在模型上将每个声明为一个字段:

class City(models.Model):
    name = models.CharField(...)
    city_hall = models.ForeignKey(Building)
    fire_station = models.ForeignKey(Building)
    # ... et cetera

如果您在 City 模型中发现这太“杂乱”,您可能会考虑使用中间CityBuildings模型:

class CityBuildings(models.Model):
    city_hall = models.ForeignKey(Building)
    fire_station = models.ForeignKey(Building)
    # ... et cetera

class City(models.Model):
    name = models.CharField(...)
    buildings = models.OneToOneField(CityBuildings)

然后,您将建筑物称为,例如,city.buildings.fire_station

这些只是建议......我不确定任何一种方式是否更“正确”

于 2009-11-30T19:23:58.613 回答
0

对于任何感兴趣的人:愚蠢的我发现了记忆技术的存在,所以我将使用应用于 (A2) 的某种形式,在城市模型上包含与“基本”建筑类型一样多的便利方法。

这至少比在两个方向上使用 FK 稍微少一些混乱,并且让代码更清楚地了解利益的分离(一方面是建模,另一方面是性能)。

很快,我做了两个项目来学习并可能借用东西或直接申请:

  1. django-memoize
  2. github.com/husio/django-easycache/

也许有人会发现这也很有用。

于 2009-12-02T14:27:08.047 回答