0

我正在开发我的第一个 Python/Django 应用程序并遇到以下问题:

我的应用程序维护一个使用Calendar模型类和CalendarDay模型类实现的预订日历。在预订时,我想查询以下CalendarDay实例:

dates = CalendarDay.objects.filter(calendar = booking.calendar, calendar_date >= booking.arrival_date, calendar_date <= booking.departure_date)

'SyntaxError: non-keyword arg after keyword arg'会在第二个和第三个参数上生成。从 Django 文档中,我了解到您应该能够做到这一点,并且条件是 AND-ed,这就是我所追求的。

或者,当我尝试时:

dates = CalendarDay.objects.filter(calendar = booking.calendar, calendar_date__ge = booking.arrival_date, calendar_date__le = booking.departure_date)

FieldError: Join on field 'calendar_date' not permitted从 Django 得到一个。

我已经完成了 Django 文档,但是 - 显然 - 我遗漏了一些东西。我究竟做错了什么?

编辑:

我最终得到了以下解决方案:

dates = CalendarDay.objects.filter(calendar = booking.calendar, calendar_date__range = [self.arrival_date, self.departure_date])
4

2 回答 2

4
dates = CalendarDay.objects.filter(calendar = booking.calendar, calendar_date__ge = booking.arrival_date, calendar_date__le = booking.departure_date)

ge 和 le 无效,使用lt(小于)或gt(大于),或gte(大于等于)和lte(小于等于)

(当你写 le - Django 尝试在名为“le”的字段上运行 sql join 但没有一个,因此你得到的错误)

于 2012-12-22T10:29:15.897 回答
1

第一次尝试

dates = CalendarDay.objects.filter(calendar = booking.calendar, calendar_date >= booking.arrival_date, calendar_date <= booking.departure_date)

calender_date >= booking.arrival_datecalender_date <= booking.departure_date评估为Trueor False。因此,您会 'SyntaxError: non-keyword arg after keyword arg'在第二个和第三个参数上得到错误。

第二次尝试

dates = CalendarDay.objects.filter(calendar = booking.calendar, calendar_date__ge = booking.arrival_date, calendar_date__le = booking.departure_date)

SQL 连接在字段“le”和“ge”上运行,但它们不存在。因此你得到FieldError: Join on field 'calendar_date' not permitted

您应该使用gteor ltewhich 分别表示大于或等于和小于或等于。

所以你的代码应该是

dates = CalendarDay.objects.filter(calendar = booking.calendar, calendar_date__gte = booking.arrival_date, calendar_date__lte = booking.departure_date)
于 2012-12-22T10:50:59.753 回答