使用本地化日期进行Django查询

时间:2011-02-21 22:50:05

标签: python django date django-models internationalization

在我的表单中,我有一个名为booking_date的DateField,它使用AdminDateWidget呈现。 booking_date字段的内容需要国际化。当我想在这样的事情中使用字段的值时出现问题:

booking = Booking.objects.get(booking_number='BN34D', booking_date='2010-11-21')

但如果我的日期格式为'%d。%m。%Y'

booking = Booking.objects.get(booking_number='BN34D', booking_date='21.11.2010')

我收到'ValidationError:输入YYYY-MM-DD格式的有效日期'

无论使用何种日期格式,我如何进行查询?

3 个答案:

答案 0 :(得分:4)

您应首先使用strftime格式的本地化版本解析它。

from datetime import datetime
d = datetime.strptime('...')
booking.objects.get(..., booking_date=d.date())

strptime

中使用这些格式

http://linux.die.net/man/3/strftime

您不应该依赖直接从用户传递到查询中。

看起来你应该从你的具体例子中做到以下几点:

d = datetime.strptime('%d.%m.%Y')
booking = Booking.objects.get(booking_nmber='BN34D', booking_date=d)

答案 1 :(得分:1)

据我了解您的问题,您事先并不确定将使用哪种语言环境。这可能会让你陷入无法解决的问题。 (“10-11-12”可能是2012年10月11日或2010年11月12日或......)

因此,您必须拥有一组有限的,可区分的可能格式。然后你可以这样做:

POSSIBLE_FORMATS = ('%d.%m.%Y', '%Y-%m-%d', '...')

for f in POSSIBLE_FORMATS:
    try:
        d = datetime.date.strptime(date_str, f)
        break
    except ValueError:
        continue
    raise ValueError

booking = Booking.objects.get(booking_number='BN34D', booking_date=d)

答案 2 :(得分:1)

我用这个解决了这个问题:

from django.utils import formats

formats.get_format('DATE_INPUT_FORMATS')[0]

然后,此格式用于解析日期xyld showed