2009-12-09 53 views
1

我目前正在开发一个项目来实现Django接口到现有的日历应用程序。日历应用程序具有MySQL作为后端数据库。Django&定制遗留数据库

在我们的自定义应用程序中,我们希望修改/扩展现有日历应用程序使用的其中一个表中的数据,例如,

# 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的合法使用吗?如果不是的话,任何人都可以推荐一种解决这个问题的方法吗

回答

2

看来你正在试图用更多的字段扩展CalendarEvent。

首先,我会做此更改CustomCalendarEvent:

code = models.CharField(max_length=80) # Mapped from name

calendar_event = models.ForeignKey(CalendarEvent)

,如果长度刚刚计算START_TIME和END_TIME之间天差我就从CustomCalendarEvent删除并使其在CalendarEvent中可调用(只是一种执行计算的方法)。

您真的不想在两个表格之间复制数据 - 这是您在CalendarEvent中有name和在CustomCalendarEvent中有code时会得到的数据。名称更新必须同步到code,如果您想要执行的所有操作都是使用更多字段扩展CalendarEvent表,那么没有理由这样做。

然后you could override the save() and delete() methods为CalendarEvent传播插入/删除更改。我相信,更新并不重要,因为CustomCalendarEvent只是CalendarEvent的扩展。

替代方法:在CalendarEvent上使用数据库插入触发器将条目传播到CustomCalendarEvent。我仍然会将CustomCalendarEvent表的外键放入CalendarEvent中,而不是重复数据。


编辑:顺便说一句,我绝不会用一个custom manager像你所提出的建议,甚至为一些副作用读操作修改数据。管理人员正在查询,而不是修改数据。

+0

感谢您的回复。开始感觉我在滥用定制管理器的目的。 – Martin 2009-12-10 00:50:43

2

为什么你不使用模型继承? CustomCalendarEvent可以从CalendarEvent继承并以这种方式添加新字段。

+0

这也是一个非常好的主意。见http://docs.djangoproject.com/en/dev/topics/db/models/#model-inheritance – cethegeek 2009-12-10 13:26:32

+0

是的......这是一个好主意。我知道Django支持抽象超类的继承,但没有意识到我可以扩展现有的类 - 在这种情况下,我不允许修改。 – Martin 2009-12-10 21:15:12