我有一个我刚刚继承的django应用程序,知道很少(一般)关于django。系统使用TastyPie提供RESTful访问。
我正在处理的功能需要能够将新报告发布到系统。 ORM模型中的报告与多个"设备"相关联。在ORM中,设备在复杂的关系系统中具有进一步的关系,例如用户,公司,其他子设备等。
当我尝试发布报告时,我经常将自己从系统中删除。在PostGreSQL日志上观察PostGreSQL查询,我可以看到这实际上执行了数千个SQL查询,检索关系模型中的所有对象。但是,最终,它需要做的就是在"报告中添加一个新条目"表格以及" report_device"中的一些条目table(作为设备的报告是多对多的关系)。
在(TastyPie)资源(称为ReportResource)中对设备的引用中,我没有用" full = True"来引用该设备。
我自己也是一位有成就的SQL开发人员,但是我不想通过编写自定义更新来解决这里的洗澡水问题(我不知道如何插入相关内容)代码无论如何)。我认为有一种方法可以让django / tastypie以合理的方式做我想做的事。
我可以提供更多信息,但我不知道相关的内容。请问你是否认为你知道什么,我会看看我是否可以解释。
答案 0 :(得分:1)
TastyPie在查询中倾向于自由。我记得使用了很多自定义dehydrate()
函数来获得我想要的东西。 http://django-tastypie.readthedocs.org/en/latest/resources.html?highlight=hydrate#Resource.dehydrate
TastyPie不喜欢表引用 - 获取太多信息太容易了。在像user = fields.ForeignKey(UserResource, 'user')
对于您自己的应用程序代码,有一种方法可以让Django QuerySet机器将查询转换为SQL。这与Postgres日志相结合,可以帮助确定问题是否与TastyPie或您的应用查询有关。
代码:
#!/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”',())