我搜索了很多,但我发现的主要是python中递归编程的例子.所以这里有一个问题:
我怎样才能做到这一点?
class A:
b = B()
class B:
a = A()
Run Code Online (Sandbox Code Playgroud) 你怎么能告诉ugettext复数形式不是单数形式,即使它们在英语中是相同的?
class News(models.Model):
class Meta:
verbose_name = _('news')
verbose_name_plural = _('news')
Run Code Online (Sandbox Code Playgroud)
makemessages给出了这个:
#: models.py:134, models.:135
msgid "news"
msgstr "noticia"
Run Code Online (Sandbox Code Playgroud)
拆分此定义会使用"重复消息定义..."来破坏编译.
我找到的解决方法:
使用 Django ORM 的此查询需要 0.03 秒:
entry = ModelA.objects.select_related(
'modelB',
'modelC',
).prefetch_related(
'modelB__modelD',
'modelE',
'modelE__modelF',
'modelE__modelF__modelG',
'modelE__modelF__modelG__modelH1',
'modelE__modelF__modelG__modelH2',
'modelE__modelF__modelG__modelH3',
'modelE__modelF__modelI',
'modelE__modelF__modelJ',
).get(id=1)
Run Code Online (Sandbox Code Playgroud)
我在 SQLAlchemy 中想出的等效方法需要 0.12 秒*:
entry = session.query(ModelA) \
.options(joinedload(ModelA.modelB).joinedload(ModelB.modelD)) \
.options(subqueryload(ModelA.modelE).subqueryload(ModelE.modelF)
.subqueryload(ModelF.modelG).subqueryload('*')) \
.options(subqueryload(ModelA.modelE).subqueryload(ModelE.modelF)
.subqueryload(ModelF.modelI)) \
.options(subqueryload(ModelA.modelE).subqueryload(ModelE.modelF)
.subqueryload(ModelF.modelJ)) \
.filter(ModelA.id = 1) \
.first()
Run Code Online (Sandbox Code Playgroud)
*我意识到在 Django 中我查询了我并不真正需要的 modelC。
subqueryload('*')同一个表所需的多个关系?modelH1modelH2modelH3ModelE实例进行迭代时,对 to 的引用会ModelA在 sqlAlchemy 中触发一个新查询,而在 Django ORM 中它会自动填充。我有什么遗漏的吗?