Django ORM两个日期之间的交集

时间:2016-01-23 06:09:47

标签: python django django-models django-orm

我有模特,像这样:

class Model(models.Model):
    name = models.CharField(max_length=255)
    start_date = models.DateField()
    end_date = models.DateField()
    user = models.ForeignKey(User)

在DB中它看起来像:

name    start_date    end_date       user
 1      2016-01-20    2016-01-26       1
 1      2016-01-24    2016-02-02       2
 1      2016-01-28    2016-02-10       3
 2      2016-01-19    2016-01-27       4

我会找到同时住在同一个地方的用户。例如,对于桌子后面,用户' 2'将住在名称为' 1'并且他可以满足用户' 1'和用户'。用户' 1'只能满足用户2'。 ' 3' - 只有用户' 2'。

你能告诉我,我如何在Django ORM中查询这个案例?

UPD

class User(models.Model):
    name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)

2 个答案:

答案 0 :(得分:1)

检查两个人是否同时在同一个地方的一种方法是使用日期并验证具有相同位置的用户是否在那个日期:

import datetime

date_wanted = datetime.datetime.today()
neighbour_users = User.objects.values('model_set__name').annotate(Q(start_date__lte = date_wanted) & Q(end_date__gte = date_wanted))

我认为也可以使用filter代替annotate

neighbour_users = User.objects.values('model_set__name').filter(start_date__lte = date_wanted, end_date__gte = date_wanted)

因此,使用values我们将用户分组到同一个地方,然后我们过滤日期以获得所需结果。

答案 1 :(得分:0)

我不确定这是否可以在单个查询中完成,但这是我将如何在代码中执行此操作。即使可以通过查询完成,也将是一个不可读的问题。您可以使用相同的逻辑来获取单个用户的邻居。

neighbors = []
models = Model.objects.all()
for m1 in models:
    for m2 in models:
        if m1.user_id != m2.user_id and \
            m1.name == m2.name and # if name represents the place
            ((m1.start_date >= m2.start_date and m1.start_date <= m2.end_date) or \
            (m2.start_date >= m1.start_date and m2.start_date <= m1.end_date)):
            neighbors.append((m1.name, m1.user, m2.user))