Django tastypie查询有不必要的内连接。 DRF很快。为什么

时间:2014-09-30 01:38:51

标签: django tastypie

我有2个表,只想简单地在秒表'Book'中获取所有项目。无需“作者”表中的任何信息。

class Author(models.Model):
    name = models.CharField(max_length=150, primary_key=True, db_index=True)

class Book(models.Model):
    title = models.CharField(max_length=150, primary_key=True, db_index=True)
    author = models.ForeignKey(Author, db_index=True)


class AuthorResource(ModelResource):
    class Meta(object):
        queryset = Author.objects.all()
        allowed_methods = ('get', 'post', 'put', 'delete')
        always_return_data = True
        filtering = { 'name' : ALL }


class BookResource(ModelResource):
    author_id = fields.IntegerField(attribute='author__id')

    class Meta(object):
        queryset = Book.objects.select_related().all()
        allowed_methods = ('get', 'post', 'put', 'delete')
        always_return_data = True
        filtering = {'title',
                      'author' : ALL_WITH_RELATIONS}

这是非常慢,我注意到Tasktypie做了很多内部联接,我不在乎。我只需要表格书中的信息。不是作者表中的任何信息。

我使用REST Framework实现了相同的Web服务API,我没有注意到速度问题。

在我的实际项目中,它约为3个表,2个表每个约有100个记录,第3个表有大约800个记录。 Tastypie需要大约1分钟才能加载,REST Framework需要几秒钟。切换到使用Tastypie后,它基本上无法正常工作。太慢了。

导致性能问题的原因是什么?我做对了吗?

我是新手使用Tastypie,不确定我是否正在进行正确的查询。我应该使用hydrate / dehydrate,obj_get_list来做这个简单的查询吗?做这个非常基本的查询的正确方法是什么。

1 个答案:

答案 0 :(得分:0)

如果您不想要,可以排除这些字段。看到这个问题。 exclude some fields in tastypie post data

OR

您可以使用ToManyField代替 select_related 来获取数据。 http://django-tastypie.readthedocs.org/en/latest/fields.html#tomanyfield