Django过滤是否两个日期字段之间的月份和年份

时间:2020-08-10 08:35:37

标签: python django django-queryset

我有以下型号:

class Project(models.Model):
    class Meta:
        verbose_name_plural = "Projects"
        verbose_name = "Project"
        db_table = "projects"

    employees = models.ManyToManyField(User, related_name="list_employee", blank=True)
    kickoff_date = models.DateField("start date", null=True, blank=True)
    close_date = models.DateField("End date(deadline)", null=True, blank=True)

# i use default user model
from django.contrib.auth.models import User

目的:我正在寻找不属于任何项目的员工 每个月中

当前有4个用户(员工):root,linh,tu,另一个

以下是表形式的数据(试图填充自由行): enter image description here

当前我有以下代码:

import time
from datetime import datetime
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
x = 12

for n in range(x):
    a[n] = time.localtime(time.mktime((now.tm_year, now.tm_mon - 2 + n, 3, 0, 0, 0, 0, 0, 0)))[:2]
    # this return a as list of tuple [(2020, 6), (2020, 7), (2020, 8), (2020, 9), (2020, 10), 
    #(2020, 11), (2020, 12), (2021, 1), (2021, 2), (2021, 3), (2021, 4), (2021, 5)]

user = User.objects.all()
for i in a:
    #trying to get all user_id from projects in that month
    p_list = list(Project.objects.filter(kickoff_date__month__gte=i[1], kickoff_date__year=i[0], close_date__month__lte=i[0],close_date__year__lte=i[0]).values_list('employees', flat=True))
    #find users that not in p_list
    d = user.exclude(id__in=p_list)
    print(i)
    print(d)

它返回以下查询集打印错误:

(2020, 6)
<QuerySet [<User: root>, <User: linh>, <User: another>, <User: tu>]>
(2020, 7)
<QuerySet [<User: root>, <User: linh>, <User: another>, <User: tu>]>
(2020, 8)
<QuerySet [<User: root>, <User: linh>, <User: another>, <User: tu>]>
(2020, 9)
<QuerySet [<User: root>, <User: linh>, <User: another>, <User: tu>]>
(2020, 10)
<QuerySet [<User: root>, <User: linh>, <User: another>, <User: tu>]>
(2020, 11)
<QuerySet [<User: root>, <User: linh>, <User: another>, <User: tu>]>
(2020, 12)
<QuerySet [<User: root>, <User: linh>, <User: another>, <User: tu>]>
(2021, 1)
<QuerySet [<User: root>, <User: linh>, <User: another>]>
(2021, 2)
<QuerySet [<User: root>, <User: linh>, <User: another>, <User: tu>]>
(2021, 3)
<QuerySet [<User: root>, <User: linh>, <User: another>, <User: tu>]>
(2021, 4)
<QuerySet [<User: root>, <User: linh>, <User: another>, <User: tu>]>
(2021, 5)
<QuerySet [<User: root>, <User: linh>, <User: another>, <User: tu>]>

所需的返回数据:

(2020, 6)
<QuerySet [<User: linh>, <User: another>, <User: tu>]>
(2020, 7)
<QuerySet [<User: linh>, <User: another>, <User: tu>]>
(2020, 8)
<QuerySet [<User: another>]>
(2020, 9)
<QuerySet [<User: another>]>
(2020, 10)
<QuerySet [<User: root>, <User: another>]>
(2020, 11)
<QuerySet [<User: root>, <User: another>]>
(2020, 12)
<QuerySet [<User: root>, <User: another>]>
(2021, 1)
<QuerySet [<User: root>, <User: another>]>
(2021, 2)
<QuerySet [<User: root>, <User: linh>, <User: another>]>
(2021, 3)
<QuerySet [<User: root>, <User: linh>, <User: another>]>
(2021, 4)
<QuerySet [<User: root>, <User: linh>, <User: another>]>
(2021, 5)
<QuerySet [<User: root>, <User: linh>, <User: another>, <User: tu>]>

我的第一个逻辑是对(年,月)的每个迭代执行->查找在kickoff_date和close_date之间具有(年,月)的所有项目的所有用户->查找不在那些用户列表中的用户

希望有人可以告诉我我的查询出了什么问题

编辑:

在通过p_list查询更新到以下内容之后:

p_list = list(Project.objects.filter(kickoff_date__month__lte=i[1], kickoff_date__year__lte=i[0], close_date__month__gte=i[1],close_date__year__gte=i[0]).values_list('employees', flat=True))

我可以得到当月包含员工的项目,但这仅适用于项目在同一年具有kickoff_dateclose_date的情况

如果该项目在不同年份有kickoff_dateclose_date,那么它将不会显示在查询结果中

0 个答案:

没有答案