【问题标题】:SyntaxError: non-keyword arg after keyword argSyntaxError:关键字 arg 之后的非关键字 arg
【发布时间】:2012-12-22 10:17:39
【问题描述】:

我正在开发我的第一个 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])

【问题讨论】:

  • django 文档在哪里声明第一个语法是有效的?因为这对我来说似乎不太可能。如果两个变量都已知,则语法 calendar_date &gt;= booking.arrival_data 最终计算为 TrueFalse,因此您将布尔值传递给该函数而无需关键字。
  • @KillianDS:是的,你是对的。我重读了文档,但没有...

标签: django django-models python-2.7


【解决方案1】:
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,但没有,因此出现错误)

【讨论】:

    【解决方案2】:

    第一次尝试

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

    calender_date &gt;= booking.arrival_datecalender_date &lt;= 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多