SyntaxError:关键字arg之后的非关键字arg

时间:2012-12-22 10:17:39

标签: django django-models python-2.7

我正在使用我的第一个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)

我从Django获得FieldError: Join on field 'calendar_date' not permitted

我已经通过Django文档工作了 - 然而 - 显然 - 我错过了一些东西。我做错了什么?

编辑:

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

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

2 个答案:

答案 0 :(得分: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 (低于等于)

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

答案 1 :(得分: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评估为TrueFalse。因此,您在第二个和第三个参数上得到'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

您应该使用gtelte,分别指代大于或等于或小于或等于。

所以你的代码应该是

dates = CalendarDay.objects.filter(calendar = booking.calendar, calendar_date__gte = booking.arrival_date, calendar_date__lte = booking.departure_date)