Django&自定义旧数据库

时间:2009-12-09 19:17:03

标签: python django legacy-database

我目前正在开发一个项目来实现现有日历应用程序的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的合法使用吗?如果没有,任何人都可以推荐另一种方法解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

您似乎正在尝试使用更多字段扩展CalendarEvent。

首先,我将对CustomCalendarEvent进行此更改:

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

calendar_event = models.ForeignKey(CalendarEvent)

如果length只计算start_time和end_time之间的天数差异,我会将它从CustomCalendarEvent中删除,并在CalendarEvent中使它成为可调用的(只是一个执行计算的方法)。

你真的不想在两个表之间复制数据 - 这是你在CalendarEvent中有name而在CustomCalendarEvent中有code时得到的。对name的更新必须同步到code,如果您要做的只是扩展CalendarEvent表中的更多字段,则没有理由这样做。

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

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


编辑:顺便说一句,我绝不会像你建议的那样使用custom manager来修改数据,即使是某些读取操作的副作用。管理者是关于查询,而不是关于修改数据。

答案 1 :(得分:2)

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