Django - 通过关联模型中的数据搜索 Q 对象
Django - Q object search by data in an associated model
我有一个查询我的数据库的 Q 对象,其工作方式如下:
class EventSearchManager(models.Manager):
q_objects = []
terms = [term.strip() for term in search_terms.split()]
today = date.today()
if timeselect == "Today":
first_day = today
last_day = None
for term in terms:
search = (
Q(name__icontains=term) |
Q(tags__label__icontains=term),
)
if first_day is not None:
operators.update({'start_date__gte': first_day})
if last_day is not None:
operators.update({'start_date__lte': last_day})
q_objects.append(Q(*search, **operators))
qs = self.get_queryset()
return qs.filter(reduce(operator.or_, q_objects))
它运作良好,但我刚刚重构了事件,以便 start_date
存在于单独的 EventInstance
模型中(这样一个事件可以有无限数量的开始日期)。
现在我想将此搜索调整为 return 事件对象,以便 operators.update({'start_date__gte': first_day})
引用所有关联的 EventInstance
对象的 start_date
。是否可以进行简单的语法调整,或者我是否需要完全重建此过程?或者我只是对 Q 对象要求太多了?
这是我建立关系的 EventInstance 模型:
class EventInstance(models.Model):
event = models.ForeignKey(Event)
start = models.DateTimeField()
duration = models.TimeField()
recurring = models.CharField(max_length=2)
Q对象与普通过滤条件完全一样。由于您可以在过滤条件中关注关系,因此您也可以在 Q 中进行。
你没有展示你的模型,但假设这个关系只是被称为 eventinstance
,你可以这样做:
operators.update({'eventinstance__start_date__gte': first_day})
我有一个查询我的数据库的 Q 对象,其工作方式如下:
class EventSearchManager(models.Manager):
q_objects = []
terms = [term.strip() for term in search_terms.split()]
today = date.today()
if timeselect == "Today":
first_day = today
last_day = None
for term in terms:
search = (
Q(name__icontains=term) |
Q(tags__label__icontains=term),
)
if first_day is not None:
operators.update({'start_date__gte': first_day})
if last_day is not None:
operators.update({'start_date__lte': last_day})
q_objects.append(Q(*search, **operators))
qs = self.get_queryset()
return qs.filter(reduce(operator.or_, q_objects))
它运作良好,但我刚刚重构了事件,以便 start_date
存在于单独的 EventInstance
模型中(这样一个事件可以有无限数量的开始日期)。
现在我想将此搜索调整为 return 事件对象,以便 operators.update({'start_date__gte': first_day})
引用所有关联的 EventInstance
对象的 start_date
。是否可以进行简单的语法调整,或者我是否需要完全重建此过程?或者我只是对 Q 对象要求太多了?
这是我建立关系的 EventInstance 模型:
class EventInstance(models.Model):
event = models.ForeignKey(Event)
start = models.DateTimeField()
duration = models.TimeField()
recurring = models.CharField(max_length=2)
Q对象与普通过滤条件完全一样。由于您可以在过滤条件中关注关系,因此您也可以在 Q 中进行。
你没有展示你的模型,但假设这个关系只是被称为 eventinstance
,你可以这样做:
operators.update({'eventinstance__start_date__gte': first_day})