我使用django序列化程序序列化了几个对象,但问题是每个序列化都从数据库中查询foerign键的id,而不是仅仅从对象中获取它
class QBAccount(CompanyModel):
company = models.ForeignKey(Company)
>>> from deretoapp.models import QBAccount
>>> import logging
>>> l = logging.getLogger('django.db.backends')
>>> l.setLevel(logging.DEBUG)
>>> l.addHandler(logging.StreamHandler())
>>> a = QBAccount.allobjects.all()[0]
>>> from django.core import serializers
>>> serializers.serialize('python', [a])
(0.000) SELECT `deretoapp_company`.`id`, ... FROM `deretoapp_company` WHERE `deretoapp_company`.`id` = 45995613-adeb-488f-9556-d69e856abe5f ; args=(u'45995613-adeb-488f-9556-d69e856abe5f',)
[{'pk': u'3de881eb-8409-4089-8de8-6e24f7281f37', 'model': u'deretoapp.qbaccount', 'fields': {... 'company': u'45995613-adeb-488f-9556-d69e856abe5f' ....}}]
有没有办法在不修改django代码的情况下改变这种行为?我知道a.company.id
将查询company表(这在理想情况下不应该发生),但是在serializer中是否有一个选项,以便它执行类似于a.company_id
的操作而不查询数据库
您应该使用Natural Keys序列化。在
本质上,这要求您在外键引用的模型上定义一个名为
natural_key
的方法,该方法返回您希望拥有的字段,代替pk根据文件:
然后在序列化期间将参数
use_natural_keys
设置为True
。在同样,从文档中:
^{pr2}$最后,我修改了django python序列化程序,以便它直接获取被引用对象的id,而不是从db获取它
我不确定它是否处理了所有
ForeighKey
用例,但它适用于company = models.ForeignKey(Company)
这样的简单情况还需要在中注册序列化程序设置.py在
^{pr2}$我还为此提交了一个bug,它现在已在django trunk中修复。 see changset
我所做的来避免额外的查询似乎也不是很有效,但是它确实做到了:将
select_related(...)
添加到原始查询集中,以便在初始查询中加载相关对象。在例如:
相关问题 更多 >
编程相关推荐