【问题标题】:How to Improve Django Tastypie web server performance如何提高 Django Tastypie Web 服务器的性能
【发布时间】:2015-03-04 22:21:48
【问题描述】:

我有一个带有 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)

Table1 有大约 50 条记录。 Table2 有大约 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 来检索数据库中的所有数据。我的机器有很好的配置,比如16GB内存。但是,加载所有数据大约需要 40 秒。太慢了。很明显有些不对劲。

我尝试了一些 Django 数据模型函数来提高性能

1) Django 查询集。如果有外键,我注意到 API 会检索所有表对象。 Table3 资源访问速度极慢。就我而言,我只想要 1 个表中的数据,对另一个表的内部连接结果不感兴趣。例如,它使用 models.Table3.objects.all()。

我尝试了 models.LabSpace.objects.select_relate()。一点帮助都没有。

2) 对于如此低性能的少量数据,我什至还没有想到 Tastypie API 缓存技术。我觉得哪里明显不对。

基本上,我不确定是 Django 还是 Tastypie 的问题。我应该去哪里看?

【问题讨论】:

    标签: django-models tastypie


    【解决方案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)
    

    【讨论】:

    • 谢谢它确实有帮助。我确实有 table1 = fields.ForeignKey(Table1Resource, 'table1', full=True)。为什么会有如此大的不同?
    • 当您指定full=True 时,它会获取所有相关对象。当设置为 false 时,它​​只会为您提供资源 URL。如果这解决了您的问题,请接受答案。
    猜你喜欢
    • 2014-10-08
    • 2021-02-22
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    相关资源
    最近更新 更多