我搜索了很多,却找不到我要找的东西。
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,一般会更好(更少的类/更多的属性,或更多的类/更少的属性)。
如果我的观点仅使用一个模型类的数据,或者它没有(或很小)区别,那会更好吗?
修改
在写作的匆忙中,我在课堂上使用了坏名字。这些属性都不是多对多字段,用户每个属性只有一个值,或者为空。
属性的数量可以随着时间的推移而扩展,但不是很多。
答案 0 :(得分:0)
将特定于一个用户的任何数据直接放入模型中。这可能是" Name"," Birthday"等等。
但是,有些事情可能会由一个单独的模型更好地服务。例如,多个人可能具有相同的爱好,或者一个用户可能具有多个爱好。将它设为一个单独的类,并根据需要使用ForeignKeyField或ManyToManyField。无论您选择什么,真正的诀窍是优化数据库查询的数量。 django-debug-toolbar在这里很有帮助。
默认情况下,拆分模型会导致多个数据库查询,因此请务必阅读select related以将其压缩为一个。
在检索查询集时,还要查看defer方法。如果您知道自己无法在特定视图中使用这些字段,则可以排除其中一些不必要的字段。
答案 1 :(得分:0)
我认为这完全取决于您的界面。
如果您必须在单个页面中公开用户的所有数据,并且您拥有单个大型模型,则最终将使用单个sql连接而不是每个较小的表一个。
相反,如果您只需要其中一些属性,那么如果您将用户表与较小的用户表连接起来,则可能会在内存使用方面获得较小的性能提升,因为您不必加载很多属性。将被使用(尽管可以通过values
(documentation here)
此外,如果您的属性不是必需的,那么您至少应该知道要填充多少属性。拥有几乎空记录的大表可能是浪费空间。也许是个问题,也许不是。这取决于你的资源。
最后,如果你真的认为你的属性可以扩展很多,你可以试试EAV approach。