模型中定义的字段无法访问

时间:2015-08-03 13:47:23

标签: django django-models django-forms django-views

我有以下型号

TimeoutException

但是,当我尝试通过class Meeting(models.Model): meeting_title = models.CharField(default='', max_length=128, blank=True, null=True) meeting_time = models.TimeField(blank=False, null=False) meeting_date = models.DateField(blank=False, null=False) def meeting_datetime(self): return datetime.combine(self.meeting_date, self.meeting_time) 访问Meeting对象时,我得到meeting_datetime

为什么Cannot resolve keyword 'meeting_datetime' into field. Choices are: id, meeting_title, meeting_time, meeting_date不是一个选项? meeting_datetime是否将其创建为def如果不是,如何将其添加为字段或以其他方式访问?

2 个答案:

答案 0 :(得分:2)

那是因为函数没有表示为Django中的字段。您必须将其称为函数以获取其值(m.meeting_datetime())。但是,如果您真的想要在不看起来像函数调用的情况下访问该值,则可以使用property decorator

class Meeting(models.Model):
    meeting_title = models.CharField(default='', max_length=128, blank=True, null=True)
    meeting_time = models.TimeField(blank=False, null=False)
    meeting_date = models.DateField(blank=False, null=False)

    @property
    def meeting_datetime(self):
        return datetime.combine(self.meeting_date, self.meeting_time)

这将允许您访问meeting_datetime函数,就像它是属性一样:

>>> m = Meeting(...)
>>> m.meeting_datetime
# data

话虽如此,您是否有充分的理由将DateFieldTimeField分开并且没有使用单DateTimeField

class Meeting(models.Model):
    meeting_title = models.CharField(default='', max_length=128, blank=True, null=True)
    meeting_datetime = models.DateTimeField()

然后,您可以使用装饰器示例访问该字段,就像上面一样。除了该值将存储在您的数据库中,而装饰器示例的值仅在您访问该属性时派生。

答案 1 :(得分:1)

您可以将模型重写为:

class Meeting(models.Model):
   meeting_title = models.CharField(default='', max_length=128, blank=True, null=True)
   meeting_time = models.TimeField(blank=False, null=False)
   meeting_date = models.DateField(blank=False, null=False)
   meeting_datetime = models.DateTimeField(blank=True, null=False)

   def save(self, *args, **kwargs):
      self.meeting_datetime = datetime.combine(self.meeting_date, self.meeting_time)
      super(Meeting, self).save(*args, **kwargs)

您可以将查询集过滤为:

meeting_objs = Meeting.objects.filter(meeting_date__gt=datetime.date.today(),meeting_time__gt=datetime.datetime.now().time() )
相关问题