【问题标题】:Django query to check if object date lies in between start date and end date of another querysetDjango查询检查对象日期是否位于另一个查询集的开始日期和结束日期之间
【发布时间】:2021-11-08 12:33:51
【问题描述】:

我有两个模型,并且都有用户模型的外键:

class UserCostCenter(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    cost_center = models.PositiveIntegerField()
    created_date = models.DateTimeField(auto_now_add=True)
    start_date = models.DateField(null=False, blank=False)
    end_date = models.DateField(null=True, blank=True)

class UserBooking(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    project = models.ForeignKey(Project, on_delete=models.CASCADE)
    date = models.DateField()
    hours = models.DecimalField()
    task = models.ForeignKey(UserProject, on_delete=models.DO_NOTHING, null=True, blank=True)
    created_date = models.DateTimeField(auto_now_add=True)
    updated_date = models.DateTimeField(null=True, blank=True)
    history = HistoricalRecords(table_name='booking_history_userbooking')

现在我想排除没有成本中心的用户预订 目前我正在这样做:

    queryset = UserBooking.objects.all()
    for booking in queryset:
        cost_center = UserCostCenter.objects.filter(
        Q(user=booking.user, start_date__lte=booking.date, end_date__gte=booking.date)
        | Q(user=booking.user, start_date__lte=booking.date,
            end_date=None)).first()
        if not cost_center:
            queryset = queryset.exclude(id=booking.id)

我不想使用 for 循环排除用户预订对象,请帮助!

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    您可以像这样在 UserCostCenter 中获取所有带有记录的 UserBooking:

    UserBooking.objects.filter(user__in=(UserCostCenter.objects.values_list('user', flat=True)))
    

    【讨论】:

    • 我试过了,但没有得到预期的结果。我想要一个查询集,它返回日期介于成本中心的开始日期和结束日期之间的 UserBooking 对象,否则如果对象的日期不在成本中心的开始日期和结束日期之间,则将其排除。
    • UserBooking.objects.filter(date__in_between=(UserCostCenter.objects.values_list('start_date', 'end_date')))
    • 类似于上面的查询集
    • 我认为您需要更改模型并在 UserBooking 和 UserCostCenter 之间创建外键。多对多关系。这样就可以得到一个没有循环的查询集
    猜你喜欢
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多