处理JSON中的日期格式以保存在Django DateField中

时间:2015-10-19 10:14:31

标签: python django

尝试从json字符串保存日期时,我在django中收到验证错误。

django.core.exceptions.ValidationError: ["'31 Oct 2016' value has an invalid date format. It must be in YYYY-MM-DD format."]

将日期字符串转换为正确格式的最佳/最简单方法是什么?

相关模型:

  class Product(models.Model):
    unique_id = models.IntegerField(unique=True)
    supplier = models.ForeignKey(Supplier)
    region = models.ForeignKey(PowerRegion)
    payment = models.ForeignKey(Payment)
    name = models.CharField(max_length=255, unique=True)
    end_date = models.DateField(blank=True, null=True)

刮刀供给模型的相关部分:

source = base_url + product_url
    rsp = s.post(source, data=submit_data2, headers=headers)
    product_detail = json.loads(rsp.text, object_pairs_hook=OrderedDict) 


product, created = Tariff.objects.get_or_create(unique_id=product_detail['productId'],
                                                   defaults={
                                                       'unique_id': product_detail['productId'],
                                                       'name': product_detail['productName'],
                                                       'supplier': supplier,
                                                       'region': region,
                                                       'payment': payment,
                                                       'end_date': product_detail['productEndDate'],
                                                   })

来自json的相关字段采用以下格式:

productEndDate: "31 Oct 2016"

1 个答案:

答案 0 :(得分:1)

只需使用django DATE_INPUT_FORMATS(https://docs.djangoproject.com/en/1.8/ref/settings/#date-input-formats)设置指定允许的日期格式

DATE_INPUT_FORMATS = ("%d %b %Y",)

但请注意,如果您已禁用本地化,此设置将起作用

USE_L10N = False

否则django将使用locale-dictated格式。

如果您需要启用本地化,则应创建自己的区域设置日期格式。

编辑:

我提供的解决方案适用于在与模型交互之前通过Django Forms验证的数据,而不是直接与Django模型交互。

您可以使用简单的datetime.strptime()将日期字符串更改为日期对象,然后将其传递给您的模型:

product_date = datetime.strptime(product_detail['productEndDate'], '%d %b %Y')

或者您可以先将收到的数据传递给适当的表单以进行验证和类型转换(因为我没有在您的代码中看到任何验证,也许您只是没有包含它在这里)然后才将数据从表单传递给模型。