python - Django 和自定义遗留数据库

标签 python django legacy-database

我目前正在开展一个项目,为现有的日历应用程序实现 Django 接口(interface)。日历应用程序以 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 触发器启动的同步脚本),但我不认为这些解决方案特别优雅。

一种可能是使用 Custom Manager为 CustomCalendarEvent 覆盖 get_query_set 功能以触发同步功能。

这是对 Django CustomManagers 的合法使用吗?如果没有,有人可以推荐解决此问题的替代方法吗?

最佳答案

看来您正在尝试使用更多字段扩展 CalendarEvent。

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

code = models.CharField(max_length=80) # 从名称映射

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像您建议的那样修改数据,即使是某些读取操作的副作用。管理人员负责查询,而不是修改数据。

关于python - Django 和自定义遗留数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1876163/

相关文章:

python - 检查一个项目是否包含在 ManyToManyField (django)

python - Django 1.4 未知命令 : 'runserver'

ruby-on-rails-3 - Rails3 和 ActiveRecord 与遗留数据库 : JOIN not returning other table columns

java - 在处理遗留数据库时,Hibernate 会因丢失的行而窒息

python - 将列添加到数据透视表( Pandas )

python - 在没有硬编码有效负载的情况下无法从一个部分中抓取所有书籍

python - Pandas 插值在 0.10 版本中发生了变化?

python - 如何向 javascript 提供 django 模板

namespaces - 在命名空间模型中设置表名

python - TIC TAC TOE 仅接受整数