我有一个带有Tastypie API的django Web服务器。性能非常慢,我不知道在哪里看。
这个问题可以这样抽象出来。它只有3个表。
class Table1(models.Model):
name = models.CharField(max_length=64)
class Table2(models.Model):
name = models.CharField(max_length=64)
table1 = models.ForeignKey(Table1)
class Table3(models.Model):
name = models.CharField(max_length=64)
table2 = models.ForeignKey(Table2)
表1有大约50条记录。表2有大约400条记录。表3有大约2000条记录。使用MySQL。
它有3个模型资源:
class Table1Resource(ModelResource):
class Meta(object):
"""Define options attached to model."""
queryset = models.Table1.objects.all()
resource_name = 'table1'
class Table2Resource(ModelResource):
class Meta(object):
"""Define options attached to model."""
queryset = models.Table2.objects.all()
resource_name = 'table2'
class Table3Resource(ModelResource):
class Meta(object):
"""Define options attached to model."""
queryset = models.Table3.objects.all()
resource_name = 'table3'
前端使用ajax调用3个Web服务API来检索数据库中的所有数据。我的机器配置非常好,例如16 GB内存。但是,加载所有数据大约需要40秒。太慢了。很明显有些事情是不对的。
我尝试了一些Django数据模型函数来提高性能
1)Django查询集。我注意到,如果有外键,API将检索所有表对象。 Table3Resource访问速度极慢。在我的例子中,我只想要1个表中的数据,对另一个表的内部连接结果不感兴趣。例如,它使用models.Table3.objects.all()。
我尝试过models.LabSpace.objects.select_relate()。没有任何帮助。
2)对于如此低性能的少量数据,我甚至都没有考虑过Tastypie API缓存技术。我觉得某处显然是错误的。
基本上,我不确定它是Django还是Tastypie问题。我应该在哪里看?
答案 0 :(得分:1)
您应指定资源ForeignKey
字段。默认为False
我相信,所以你必须这样做:
class Table2Resource(ModelResource):
table1 = fields.ToOneField(Table1Resource)
class Meta(object):
"""Define options attached to model."""
queryset = models.Table2.objects.all()
resource_name = 'table2'
# etc ...
如果没有,你可以尝试明确地设置它:
table1 = fields.ToOneField(Table1Resource, 'table1', full=False)