【问题标题】:Comparing a database field with date将数据库字段与日期进行比较
【发布时间】:2018-04-18 13:24:10
【问题描述】:

我正在尝试将字段与实际日期进行比较,但遇到此错误“'Certificate' object is not subscriptable”

if datetime.datetime.strptime(c.certificate['date_certified'], '%Y-%m-%d').date() >= datetime.date('2016-01-01'):

谁能告诉我哪里出了问题以及可能的解决方案?

组件和证书模型的定义

class Component(models.Model):
certificate = models.ForeignKey(
    Certificate,
    blank=True,
    null=True,
    on_delete=models.SET_NULL,
    verbose_name=_('Certificate'),
    help_text=_('Certificates are named after its first assigned component.'))


class Certificate(models.Model):
date_certified = models.DateField(
    null=True, verbose_name=_('Date certified'))

错误信息:

if datetime.datetime.strptime(c.certificate.date_certified, '%Y-%m-%d').date() >= datetime.date('2016-01-01'):

TypeError: strptime() 参数 1 必须是 str,而不是 datetime.date

field_date = (str(c.certificate.date_certified))
        if datetime.datetime.strptime(field_date, '%Y-%m-%d').date() >= datetime.date('2016-01-01'):

TypeError:需要一个整数(类型为 str)

我尝试了一些方法,但不断收到 str、int 错误

【问题讨论】:

  • 您必须提供更多详细信息,例如您的models.py 的某些部分。
  • 什么是证书对象?字典、模型还是其他东西?提供证书对象的定义来回答这个问题。
  • def print_info_person_new_certified_component(): for c in Component.objects.all(): if c.certificate: if datetime.datetime.strptime(c.certificate['date_certified'], '%Y-%m-%d').date() >= datetime.date('2016-01-01'): print('First name: ' + c.in_house_responsibility.first_name)
  • 证书是在不同的models.py文件中定义的模型。如果该条件得到执行,我需要打印一些值
  • 请显示组件和证书模型的定义。并且不要在 cmets 中编写代码;把它作为问题的更新。

标签: python django postgresql psql


【解决方案1】:

您不能通过字典表示法访问模型字段;你使用点符号。您已经为c.certificate 这样做了;您需要对证书字段本身的属性执行相同的操作,就像对 c.in_house_responsibility.first_name 所做的一样。

if c.certificate.date_certified ...

【讨论】:

  • 谢谢。它得到了解决,但我在同一代码中面临另一个问题。如果你能调查一下。
  • @Ressaq 对于不同的问题,请打开一个新问题。
  • date_certified 已经是一个日期时间。为什么要打电话给strptime呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多