我有模特,像这样:
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)
答案 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))