Django&定制遗留数据库

2024-04-20 14:26:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在进行一个项目,以实现一个现有日历应用程序的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的合法使用吗?如果没有,有人能推荐一种解决这个问题的替代方法吗?在


Tags: djangoname应用程序bymodeltimemodelsmysql
2条回答

为什么不使用模型继承?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来修改数据,即使这是某些读取操作的副作用。管理者关心的是查询,而不是修改数据。在

相关问题 更多 >