我有一个过滤器:
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()
但对于我已经触手可及的记录来说,这似乎是一个毫无意义的额外数据库查询。
答案 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
字段。
(注意,由于该字段是由数据库计算的,如果事件在内存中更改其可连接状态 - 要么是因为您明确更改日期,要么是因为日期到期 - 可连接字段将不会更新在实践中,这不应该是一个很大的问题。)