我有一个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
模型中(这样一个事件可以有无限量的开始日期)。
现在我想调整此搜索以返回Event对象,以便operators.update({'start_date__gte': first_day})
引用所有关联的start_date
对象的EventInstance
。我可以进行简单的语法调整,还是需要完全重建这个过程?或者我只是问了太多的Q对象?
这是我建立关系的EventInstance模型:
class EventInstance(models.Model):
event = models.ForeignKey(Event)
start = models.DateTimeField()
duration = models.TimeField()
recurring = models.CharField(max_length=2)
答案 0 :(得分:3)
Q对象与普通过滤条件完全相同。由于您可以在过滤条件中遵循关系,因此您也可以在Q中执行此操作。
您不会展示您的模型,但假设该关系名为eventinstance
,您可以这样做:
operators.update({'eventinstance__start_date__gte': first_day})