我有以下型号
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
如果不是,如何将其添加为字段或以其他方式访问?
答案 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
话虽如此,您是否有充分的理由将DateField
和TimeField
分开并且没有使用单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() )