Python 两个日期之间的Django ORM交叉
我有一个模型,像这样:Python 两个日期之间的Django ORM交叉,python,django,django-models,django-orm,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
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”和用户“3”见面。用户“1”只能满足用户“2”3'-仅限用户“2”
你能告诉我,我如何用Django ORM查询这个案例吗
UPD
class User(models.Model):
name = models.CharField(max_length=255)
last_name = models.CharField(max_length=255)
检查两个人是否在同一时间在同一地点的一种方法是使用日期,并验证哪些具有相同位置的用户在该日期:
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))
我认为也可以使用过滤器
而不是注释
:
neighbour_users = User.objects.values('model_set__name').filter(start_date__lte = date_wanted, end_date__gte = date_wanted)
因此,使用
值
我们将用户分组在同一个位置,然后筛选日期以获得想要的结果。我不确定这是否可以在单个查询中完成,但下面是我如何在代码中完成的。即使可以用一个查询来完成,它也将是一个不可读的查询。您可以使用相同的逻辑来获取单个用户的邻居
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))
邻居=[]
models=Model.objects.all()
对于模型中的m1:
对于模型中的m2:
如果m1.user_id!=m2.U用户id和\
m1.name==m2.name和#如果name代表地点
((m1.start_date>=m2.start_date和m1.start_date=m1.start_date和m2.start_date如果您发送类用户(models.Model)
,您需要的东西并不明显(至少对我而言)用户模型只有名字、姓氏之类的字段,这并不重要。您在问题中提到的位置
在哪里?是数据库中的名称
列吗?如果是,用户2与用户1和用户3有共同的位置(名称为1的位置),用户1也有相同的位置(用户1的地名是“1”)因此,用户1与用户2和用户3也有相同的位置,但您提到的用户1只能与用户2见面!是的,位置是“名称”列。用户3与用户1的日期范围不同,这就是他们不能见面的原因。我会使用类似用户的方法。get_Neights()这必须返回表Model
中的行。这并不能回答问题。这会给用户给定日期的某个位置。@nima我想你错了:它会给用户给定日期的同一位置。请参阅forvalues()
:值('Model\u set\u name'))
只对模型
行进行分组,这些行在名称
字段中具有相同的值。这很有趣,但我将在表中为用户设置几行,我希望获得与其他用户的所有交点位置和日期。可能,您的代码可以工作,但我认为这是一个缓慢的决定。我希望在DB中执行。如果您使用每个日期而不是第一个和最后一个日期创建一个新表。可以检查此表是否在名称和日期匹配上进行自联接。@joelgoldstick是的,这将简化本例中的查询,但我认为在其他情况下会使事情复杂化。此外,创建此表并保留旧表可能会导致不一致。