模型中定义的字段不可访问
Defined field in model not accessible
我有以下型号
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_datetime
访问 Meeting
对象时,我得到 Cannot resolve keyword 'meeting_datetime' into field. Choices are: id, meeting_title, meeting_time, meeting_date
.
为什么 meeting_datetime
不是一个选项? def
不会将其创建为 DateTimeField?
如果没有,我如何将其添加为字段或以其他方式访问它?
您可以将模型重写为:
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() )
那是因为函数在 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()
然后您就可以像上面的装饰器示例一样访问该字段。除了该值将存储在您的数据库中,而装饰器示例的值仅在您访问 属性.
时派生
我有以下型号
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_datetime
访问 Meeting
对象时,我得到 Cannot resolve keyword 'meeting_datetime' into field. Choices are: id, meeting_title, meeting_time, meeting_date
.
为什么 meeting_datetime
不是一个选项? def
不会将其创建为 DateTimeField?
如果没有,我如何将其添加为字段或以其他方式访问它?
您可以将模型重写为:
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() )
那是因为函数在 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()
然后您就可以像上面的装饰器示例一样访问该字段。除了该值将存储在您的数据库中,而装饰器示例的值仅在您访问 属性.
时派生