我的问题是使用每种方法的影响是什么,哪种方法是适合我情况的解决方案?我包含了下面的示例代码,它是我正在做的片段。
背景:我正在开发一个应用程序来跟踪和排序照片,并在其中有一个数据库表,用于存储这些照片的元数据,包括照片拍摄时间。由于照片是在特定地点拍摄的,因此拍摄日期和时间与关联时区有关。由于 SQL 与时区的关系不容易处理,我选择记录照片拍摄时间的两个列:一个 datetime 存储日期和时间,一个字符串存储时区名称。(请不要讨论如何在 SQL 中存储时区感知日期和时间的问题。)我想要的是模型类上的单个参数,可以用于获取正确的 Python datetime 对象,并且我也可以像设置任何其他列一样设置它。
这是我的表格:
class Photo(db.Model):
__tablename__ = 'photos'
id = db.Column(db.Integer, primary_key=True)
...
taken_dt = db.Column(db.datetime, nullable=False)
taken_tz = db.Column(db.String(64), nullable=False)
...
这是我使用混合参数的代码(在上面的datetime/pytz类中添加,datetime/pytz代码是伪代码):
@hybrid_parameter
def taken(self):
return datetime.datetime(self.taken_dt, self.taken_tz)
@taken.setter(self, dt):
self.taken_dt = dt
self.taken_tz = dt.tzinfo
从那里开始,我不确定我需要什么样的@taken.expression
或@taken.comparator
,或者为什么我会选择一个而不是另一个。
这是我使用复合列(再次添加到上面的类中,datetime/pytz代码是伪代码)所拥有的:
taken = composite(DateTimeTimeZone._make, taken_dt, taken,tz)
class DateTimeTimeZone(object):
def __init__(self, dt, tz):
self.dt = dt
self.tz = tz
@classmethod
def from_db(cls, dt, tz):
return DateTimeTimeZone(dt, tz)
@classmethod
def from_dt(cls, dt):
return DateTimeTimeZone(dt, dt.tzinfo)
def __composite_values__(self):
return (self.dt, self.tz)
def value(self):
#This is here so I can get the actual datetime.datetime object
return datetime.datetime(self.dt, self.tz)
看起来这种方法有相当多的额外开销,我无法想出一种直接从datetime.datetime对象设置它的方式,而不必先实例化值对象使用.from_dt
。
如果我走错了方向,希望能得到任何指导。谢谢!