我目前正在开展一个项目,为现有的日历应用程序实现 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/