1

我目前正在开展一个项目,以实现现有日历应用程序的 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使用自定义管理器并覆盖get_query_set功能以触发同步功能。

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

4

2 回答 2

2

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

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

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

calendar_event = models.ForeignKey(CalendarEvent)

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

您真的不想在两个表之间复制数据 - 这是您name在 CalendarEvent 和codeCustomCalendarEvent 中获得的结果。必须同步对名称的更新code,如果您只想用更多字段扩展 CalendarEvent 表,则没有理由这样做。

然后,您可以覆盖 CalendarEvent 的save()anddelete()方法来传播插入/删除更改。我相信更新对您而言并不重要,因为 CustomCalendarEvent 只是 CalendarEvent 的扩展。

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


编辑:顺便说一句,我永远不会像您建议的那样使用自定义管理器来修改数据,即使是某些读取操作的副作用。管理器是关于查询的,而不是关于修改数据的。

于 2009-12-09T22:00:42.697 回答
2

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

于 2009-12-10T09:13:58.500 回答