django更新的SQL查询数

时间:2014-05-29 15:38:32

标签: django postgresql tastypie

我有一个我刚刚继承的django应用程序,知道很少(一般)关于django。系统使用TastyPie提供RESTful访问。

我正在处理的功能需要能够将新报告发布到系统。 ORM模型中的报告与多个"设备"相关联。在ORM中,设备在复杂的关系系统中具有进一步的关系,例如用户,公司,其他子设备等。

当我尝试发布报告时,我经常将自己从系统中删除。在PostGreSQL日志上观察PostGreSQL查询,我可以看到这实际上执行了数千个SQL查询,检索关系模型中的所有对象。但是,最终,它需要做的就是在"报告中添加一个新条目"表格以及" report_device"中的一些条目table(作为设备的报告是多对多的关系)。

在(TastyPie)资源(称为ReportResource)中对设备的引用中,我没有用" full = True"来引用该设备。

  1. 为什么系统在只需更新两个表时执行如此多的数据库查询?
  2. 如何阻止它执行此操作并提供更优化的更新机制?
  3. 我自己也是一位有成就的SQL开发人员,但是我不想通过编写自定义更新来解决这里的洗澡水问题(我不知道如何插入相关内容)代码无论如何)。我认为有一种方法可以让django / tastypie以合理的方式做我想做的事。

    我可以提供更多信息,但我不知道相关的内容。请问你是否认为你知道什么,我会看看我是否可以解释。

1 个答案:

答案 0 :(得分:1)

  1. TastyPie在查询中倾向于自由。我记得使用了很多自定义dehydrate()函数来获得我想要的东西。 http://django-tastypie.readthedocs.org/en/latest/resources.html?highlight=hydrate#Resource.dehydrate

  2. TastyPie不喜欢表引用 - 获取太多信息太容易了。在像user = fields.ForeignKey(UserResource, 'user')

  3. 这样的代码上投下可疑的眼球
  4. 对于您自己的应用程序代码,有一种方法可以让Django QuerySet机器将查询转换为SQL。这与Postgres日志相结合,可以帮助确定问题是否与TastyPie或您的应用查询有关。

  5. 代码:

    #!/usr/bin/env python
    
    '''
    logquery.py -- expose database queries (SQL)
    '''
    
    import functools, os, sys
    
    os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings.local'
    sys.path.append('project/project')
    
    from meetup.models import Meeting
    
    def output(arg):
        print arg
        print
    
    
    class LoggingObj(object):
        def __init__(self, other):
            self.other = other
    
        def log_call(self, ofunc, *args, **kwargs):
            res = ofunc(*args, **kwargs)
            print 'CALL:',ofunc.__name__,args,kwargs
            print '=>',res
            return res
    
    
        def __getattr__(self, key):
            ofunc = getattr(self.other, key)
            if not callable(ofunc):
                return ofunc
            return functools.partial(self.log_call, ofunc)
    
    
    qs = Meeting.objects.all()
    output( qs.query )
    
    
    qs = Meeting.objects.all()
    qs.query = LoggingObj(qs.query)
    output( qs.query.sql_with_params() )
    
    output( list(qs) )
    

    部分输出,使用SQL:

      

    SELECT“meetup_meeting”。“id”,“meetup_meeting”。“name”,   “meetup_meeting”。“meet_date”来自“meetup_meeting”

         

    CALL:sql_with_params(){}   => (u'SELECT“meetup_meeting”。“id”,“meetup_meeting”。“name”,“meetup_meeting”。“meet_date”FROM“meetup_meeting”',())(u'SELECT   “meetup_meeting”。“id”,“meetup_meeting”。“name”,   “meetup_meeting”。“meet_date”FROM“meetup_meeting”',())