评估已知对象的查找

时间:2017-07-29 16:45:16

标签: django

我有一个过滤器:

class EventManager(models.Manager):
    def joinable(self, current_time):
        query = Q(join_time__lte=current_time) & Q(end_time__gte=current_time)
        return self.filter(query)

所以,给定时间,返回您可以加入的事件。我还想在事件中添加can_join方法:

class Event(models.Model):
    def is_joinable(self, current_time):
        return self.join_time <= current_time & self.end_time >= current_time

但是我想避免在这里重复逻辑(实际的逻辑稍微复杂一点,可能会改变)。 is_joinable是否有办法评估查询并确定self是否会通过该查询?或者我可以在其他方法之上编写这两种方法吗?显然我可以做类似

的事情
query = Q(id=self.id) & joinable_query
return Event.objects.filter(query).exists()

但对于我已经触手可及的记录来说,这似乎是一个毫无意义的额外数据库查询。

1 个答案:

答案 0 :(得分:0)

您可以使用http://madlib.incubator.apache.org/docs/master/group__grp__kmeans.html对数据库进行计算,并将结果注释为布尔字段,然后对该字段进行过滤。

类似的东西:

class EventManager(models.Manager):
    def get_queryset(self):
        return self.annotate(
            joinable=Case(
               When(start_date__lte=now, end_date__gte=now, then=Value(True)),
               default=Value(False),
               output_field=models.BooleanField()
         ))

现在,您可以对Event.objects.filter(joinable=True)进行过滤,并且每个Event对象将始终具有值为True或False的joinable字段。

(注意,由于该字段是由数据库计算的,如果事件在内存中更改其可连接状态 - 要么是因为您明确更改日期,要么是因为日期到期 - 可连接字段将不会更新在实践中,这不应该是一个很大的问题。)