Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 两个日期之间的Django ORM交叉_Python_Django_Django Models_Django Orm - Fatal编程技术网

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我想你错了:它会给用户给定日期的同一位置。请参阅for
values()
值('Model\u set\u name'))
只对
模型
行进行分组,这些行在
名称
字段中具有相同的值。这很有趣,但我将在表中为用户设置几行,我希望获得与其他用户的所有交点位置和日期。可能,您的代码可以工作,但我认为这是一个缓慢的决定。我希望在DB中执行。如果您使用每个日期而不是第一个和最后一个日期创建一个新表。可以检查此表是否在名称和日期匹配上进行自联接。@joelgoldstick是的,这将简化本例中的查询,但我认为在其他情况下会使事情复杂化。此外,创建此表并保留旧表可能会导致不一致。