这是我的查询:
Personne
模型,可能要经过一个或多个旅行PersonneTravel
。PersonneTravel
,该travel
字段是TagWithValue
s
是“开始”日期,例如“ 1954-05-01”e
是结束日期,例如“ 1999-05-01”travel
是类似“法国巴黎”的字符串因此,我正在做一个基本的“搜索”以筛选出谁旅行和何时旅行。
这是我的操作方式,因为我是django的初学者,所以我很确定可以对其进行优化:
pk
的TagWithValue
具有匹配value
pk
的PersonneTravel
有一个旅游匹配那些PK的前Personne
与PersonneTravel
pk匹配的内容我只想返回一个这样的联接(这当然不是好用的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=True
withvalues_list()
获取值列表,而不是值类型列表。该解决方案可以用来进一步简化related_name在ForeignKey
Django的模型栏。
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 。Personne
PersonneTravel
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] 删除。
我来说两句