大师:
我有一个非常简单的数据模型,通过User
关联两种不同类型的Interaction
:
# myapp/models.py
class C1(models.Model):
user = models.ForeignKey(User)
class C2(models.Model):
user = models.ForeignKey(User)
class Interaction(models.Model):
c1 = models.ForeignKey(C1)
c2 = models.ForeignKey(C2)
date = models.DateField()
因此,Interaction
有一个User
类C1
,一个User
类C2
和一个日期(除主键外) ,自动整数);一对给定的用户可以拥有多个Interaction
s。
我使用2000个随机User
s(每个类1000个)填充数据库,当我查询Interaction
时,运行时间太慢(大约三秒钟 - 在生产环境中不可接受)。 / p>
我可以采取哪些措施来改善此搜索的运行时间吗?我应该以不同的方式定义Interaction
吗?
感谢。
答案 0 :(得分:4)
如果您想存储与您的用户相关的其他信息,Django提供了一种方法来指定特定于站点的相关模型 - 称为“用户配置文件” - 用于此目的。
要使用此功能,请定义一个模型,其中包含您要存储的其他信息的字段,或者您希望提供的其他方法,还要将模型中的OneToOneField添加到用户模型。这将确保只能为每个用户创建一个模型实例。例如:
# settings.py
AUTH_PROFILE_MODULE = 'myapp.UserProfile'
# myapp/models.py
class UserProfile(models.Model):
CLASS_CHOICES = (
(0, 'Yellow User'),
(1, 'Green User'),
)
user_class = models.IntegerField(choices=CLASS_CHOICES)
user = models.OneToOneField(User)
class Interaction(models.Model):
u1 = models.ForeignKey(User, related_name='u1s')
u2 = models.ForeignKey(User, related_name='u2s')
date = models.DateField()
为每个User类创建一个新模型和关联表似乎不是一个好的设计。
答案 1 :(得分:0)
您使用外键将C1, C2
与Users
相关联,并将其称为一对多关系。但是,Interaction
C1, C2
之间的关系不是一对多关系,因为一个Interaction
可以与许多Users
相关联,而一个User
也可以与之相关的许多Interactions
。这被称为多对多关系,并使用models.ManyToManyField
在Django模型中表示。
因此,请尝试将models.py
文件更改为 -
class Interaction(models.Model):
ic1 = models.ManyToManyField(C1)
ic2 = models.ManyToManyField(C2)
date= models.DateField()
看看这是否有帮助......