【问题标题】:Python won't assign the right value in simple "if" statementPython 不会在简单的“if”语句中分配正确的值
【发布时间】:2015-03-20 01:22:41
【问题描述】:

我有一个Django 项目,用户可以在其中创建预订。 我将 Tastypie 用于向其提交简单 POST 请求的 API,以便在数据库中创建预订。

假设我们有一个像这样的request(from Chrome 网络标签)

{passenger_name: "John", service_time_start: "12:12:12", flight_time: "12:12:12",…}
car_type: false
passenger_email: "john@gmail.com"
passenger_lastname: "Smith"
passenger_name: "John"
passenger_number: "5"
route_end: "Los Angeles"
route_start: "New York"

我在服务器端使用此代码(models.py)。
我想用Django Signals将 car_type 分配给实例

''' Change car type for new reservation '''
@receiver(pre_save, sender=Reservation)
def smart_car_options(sender, instance, *args, **kwargs):

    print 'SIGNAL: pass_no: ', instance.passenger_number
    print 'SIGNAL: car_type: ', type(instance.car_type)

    if instance.car_type == False:
        if instance.passenger_number <= 3:
            instance.car_type = 'CAR'
        if 4 < instance.passenger_number <= 8:
            instance.car_type = 'VAN'
        if instance.passenger_number > 8:
            instance.car_type = 'BUS'

    print "--------------------------------------------"
    print 'SIGNAL: pass_no: ', instance.passenger_number
    print 'SIGNAL: car_type: ', instance.car_type

如您所见,instance.car_type 被设置为'BUS',而它应该设置为'VAN'我做错了什么?

另外,这是request 的控制台输出:

[20/Mar/2015 02:10:21] "POST /api/reservation/ HTTP/1.1" 201 736
[20/Mar/2015 02:10:40] "GET /forms/as_shuttle/ HTTP/1.1" 200 16237
[20/Mar/2015 02:10:52] "GET /static/debug_toolbar/css/toolbar.css HTTP/1.1" 304 0
SIGNAL: pass_no:  5
SIGNAL: car_type:  <type 'bool'>
--------------------------------------------
SIGNAL: pass_no:  5
SIGNAL: car_type:  BUS
[20/Mar/2015 02:11:06] "POST /api/reservation/ HTTP/1.1" 201 732

看起来passenger_number 设置正确,但它仍然不会为实例分配正确的值。它总是分配最后一个值,'BUS'

PS:相同的代码在 django admin 中运行良好。

【问题讨论】:

  • 尝试 if elif else 结构而不是 if if if

标签: python django django-admin tastypie django-signals


【解决方案1】:

可能是您没有将passenger_number 转换为整数,因此比较运算符是在字符串和整数之间进行比较。

>>> "5" < 8
False
>>> "5" > 8
True

所以试试num_passengers = int(instance.passenger_number) 之类的东西,然后与之进行比较。

【讨论】:

  • 很可能是这种情况。另一个可能发生但现在似乎没有发生的问题是false 可能会被转换为字符串。请务必牢记这一点。
  • 这种将字符串与数字进行比较的能力似乎是 Python 2 特有的。在 Python 3 中,它会生成 TypeError
猜你喜欢
  • 2018-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 1970-01-01
  • 2020-02-22
  • 2019-03-17
相关资源
最近更新 更多