我有以下型号:
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,另一个
当前我有以下代码:
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_date
和close_date
的情况
如果该项目在不同年份有kickoff_date
和close_date
,那么它将不会显示在查询结果中