我目前正在进行一个项目,以实现一个现有日历应用程序的Django接口。日历应用程序的后端数据库是MySQL。在
在我们的自定义应用程序中,我们希望修改/扩展现有日历应用程序使用的某个表中的数据,例如
# Auto-generated by inspectdb - table used by calendar application
class CalendarEvent(models.Model:)
name = models.CharField(max_length=80)
start_time = models.DateTimeField()
end_time = models.DateTimeField()
# Manually created table
class CustomCalendarEvent(models.Model:)
code = models.CharField(max_length=80) # Mapped from name
length = models.DateTimeField() # start_time - stop_time
.... additional data ....
我们还希望我们的数据表示与现有的日历表保持同步,即当在日历应用程序中创建新条目时,这些条目将自动传播到我们的自定义表中。在
我可以想出两种明显的方法来实现这一点(例如,由cron或MySQL触发器启动的同步脚本),但我不认为这些解决方案特别优雅。在
一种可能是对CustomCalendarEvent使用Custom Manager,并重写get_query_set功能来触发同步函数。在
这是Django CustomManagers的合法使用吗?如果没有,有人能推荐一种解决这个问题的替代方法吗?在
为什么不使用模型继承?
CustomCalendarEvent
可以从CalendarEvent
继承并以这种方式添加新字段。在您似乎正在尝试使用更多字段扩展CalendarEvent。在
首先,我将对CustomCalendarEvent进行以下更改:
code = models.CharField(max_length=80) # Mapped from name
calendar_event = models.ForeignKey(CalendarEvent)
如果length只是计算开始时间和结束时间之间的天数差,我会将它从CustomCalendarEvent中删除,改为在CalendarEvent中可调用(只是一个进行计算的方法)。在
您真的不想在两个表之间复制数据—这是当CalendarEvent中有
name
和CustomCalendarEvent中的code
时得到的结果。对name的更新必须同步到code
,如果您只想用更多字段扩展CalendarEvent表,那么没有理由这样做。在然后you could override the ^{} and ^{} methods 为CalendarEvent传播插入/删除更改。我相信,在您的情况下,更新并不重要,因为CustomCalendarEvent只是CalendarEvent的扩展。在
替代方法:对CalendarEvent使用数据库插入触发器,将条目传播到CustomCalendarEvent。我仍然希望CustomCalendarEvent表在CalendarEvent中有一个外键,而不是复制数据。在
EDIT:顺便说一句,我绝不会像您建议的那样使用custom manager来修改数据,即使这是某些读取操作的副作用。管理者关心的是查询,而不是修改数据。在
相关问题 更多 >
编程相关推荐