Django模型中的属性数

时间:2014-03-14 13:42:14

标签: python django

我搜索了很多,却找不到我要找的东西。

django中模型类的最佳概念是什么?

要扩展User,最好是拥有一个具有多个属性的类,或者将此类分解为几个具有少量属性的类?我现在正在使用django ORM。

假设我有一个名为Person的类,它扩展了User,会更好:

class Person(models.Model):
    user = foreingkey(User)
    attribute1 =
    ...
    attributeN =

或者,这样做会更好:

class PersonContac(models.Model):
    user = foreingkey(User)
    attribute1 =
    ...
    attribute3 =

class PersonAddress(models.Model):
    user = foreingkey(User)
    attribute1 =
    ...
    attribute3 =

class PersonHobby(models.Model):
    user = foreingkey(User)
    attribute1 =
    ...
    attribute3 =

我的每个观点都会使用较小类的数据(可能)。

随着时间的推移,atrribute数字可以扩展。

我想做的就是做一次,并尽量少触摸。 用户可以填充各种属性,不需要它们。 用户数量不确定(可以很多)。

我担心长期表现和维持。

如果有人能解释我,对我的代码有什么好处,以及为什么。 使用Django ORM,一般会更好(更少的类/更多的属性,或更多的类/更少的属性)。

如果我的观点仅使用一个模型类的数据,或者它没有(或很小)区别,那会更好吗?

修改

在写作的匆忙中,我在课堂上使用了坏名字。这些属性都不是多对多字段,用户每个属性只有一个值,或者为空。

属性的数量可以随着时间的推移而扩展,但不是很多。

2 个答案:

答案 0 :(得分:0)

将特定于一个用户的任何数据直接放入模型中。这可能是" Name"," Birthday"等等。

但是,有些事情可能会由一个单独的模型更好地服务。例如,多个人可能具有相同的爱好,或者一个用户可能具有多个爱好。将它设为一个单独的类,并根据需要使用ForeignKeyField或ManyToManyField。

无论您选择什么,真正的诀窍是优化数据库查询的数量。 django-debug-toolbar在这里很有帮助。

默认情况下,拆分模型会导致多个数据库查询,因此请务必阅读select related以将其压缩为一个。

在检索查询集时,还要查看defer方法。如果您知道自己无法在特定视图中使用这些字段,则可以排除其中一些不必要的字段。

答案 1 :(得分:0)

我认为这完全取决于您的界面。

如果您必须在单个页面中公开用户的所有数据,并且您拥有单个大型模型,则最终将使用单个sql连接而不是每个较小的表一个。

相反,如果您只需要其中一些属性,那么如果您将用户表与较小的用户表连接起来,则可能会在内存使用方面获得较小的性能提升,因为您不必加载很多属性。将被使用(尽管可以通过valuesdocumentation here

来减轻这种情况

此外,如果您的属性不是必需的,那么您至少应该知道要填充多少属性。拥有几乎空记录的大表可能是浪费空间。也许是个问题,也许不是。这取决于你的资源。

最后,如果你真的认为你的属性可以扩展很多,你可以试试EAV approach