使用Django查询优化

奥利维尔·庞斯(Olivier Pons)

这是我的查询:

  • 我有一个Personne模型,可能要经过一个或多个旅行PersonneTravel
  • 在中PersonneTravel,该travel字段是TagWithValue
  • s 是“开始”日期,例如“ 1954-05-01”
  • e 是结束日期,例如“ 1999-05-01”
  • travel 是类似“法国巴黎”的字符串

因此,我正在做一个基本的“搜索”以筛选出谁旅行和何时旅行。

这是我的操作方式,因为我是django的初学者,所以我很确定可以对其进行优化:

  1. 我检索所有pkTagWithValue具有匹配value
  2. 我检索所有pkPersonneTravel有一个旅游匹配那些PK的前
  3. 我检索了所有PersonnePersonneTravelpk匹配的内容

我只想返回一个这样的联接(这当然不是好用的sql,但是只是为了获得一个好主意):

SELECT ALL PersonneTravel PT
JOIN Personne P on P.personne_travel__pk = PT.pk
JOIN TagWithValue T
WHERE T.personne__pk = P.pk
AND T.value = "Paris, France"
AND T.tag = TYPE_GOOGLEMAPS

有没有一种方法可以对此进行优化,并通过下面的代码来实现?

q = Q()
if s:
    q = q & Q(date_start__gte=s)
if e:
    q = q & Q(date_end__lte=e)
retour = [a[0] for a in TagWithValue.objects.filter(
    type_tag__exact=BaseTag.TYPE_GOOGLEMAPS,
    value__exact=travel).values_list('pk')]
retour = PersonneTravel.objects.filter(Q(travel__in=retour) & q)\
    .values_list('personne__pk')
if len(retour):
    retour = Personne.objects.filter(pk__in=retour)
匿名的

不需要Q()在这里使用使用flat=Truewithvalues_list()获取值列表,而不是值类型列表。该解决方案可以用来进一步简化related_nameForeignKeyDjango的模型栏。

key = {}
if s:
    key['date_start__gte'] = s
if e:
    key['date_end__lte'] = e
key[travel__type_tag__exact] = BaseTag.TYPE_GOOGLEMAPS
key[travel__value__exact] = travel

retour = PersonneTravel.objects.filter(**key)\
    .values_list('personne__pk', flat=True)

if len(retour):
    retour = Personne.objects.filter(pk__id__in=retour)

的示例related_name:假设分别是模型中related_personne的related_name PersonnePersonneTravel

key = {}
key['related_personne__travel__type_tag__exact'] = BaseTag.TYPE_GOOGLEMAPS
key['related_personne__travel__value__exact'] = travel
if s:
    key['related_personne__date_start__gte'] = s
if e:
    key['related_personne__date_end__lte'] = e

retour = Personne.objects.filter(**key)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章