【问题标题】:Django - Q object search by data in an associated modelDjango - 通过关联模型中的数据搜索 Q 对象
【发布时间】:2016-10-09 04:39:48
【问题描述】:

我有一个 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}) 引用所有关联 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)

【问题讨论】:

    标签: django django-q


    【解决方案1】:

    Q 对象与普通过滤条件完全相同。由于您可以在过滤条件中跟踪关系,因此您也可以在 Q 中进行。

    你没有展示你的模型,但假设关系只是被称为eventinstance,你可以这样做:

    operators.update({'eventinstance__start_date__gte': first_day})
    

    【讨论】:

      猜你喜欢
      • 2018-03-23
      • 1970-01-01
      • 2014-02-26
      • 1970-01-01
      • 2014-05-31
      • 1970-01-01
      • 2013-09-08
      • 2021-10-31
      • 1970-01-01
      相关资源
      最近更新 更多