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