关于链式ForeignKeys方法的Django模型建议

时间:2013-06-27 10:26:34

标签: django django-models django-admin

我在Django 1.5中有这些模型

class Number(models.Model):
    number = models.CharField("Patient's Number", max_length=12, unique=True)

class Appointment(models.Model):
    to_number = models.ForeignKey(Number)
    message = models.CharField("Message", max_length=160)

我希望Appointment模型能够容纳另一个字段,该字段允许我添加用户希望在实际预约时间之前通过电子邮件通知的次数(类似于我们添加多个弹出/电子邮件通知的方式)在谷歌日历中)。由于我还是网络开发,Django和数据库模型的新手,我很难决定如何创建和链接模型来实现这一目标。我想到的一个解决方案是创建另一个模型并将其与Appointment链接起来,如下所示:

class Notification(models.Model):
    appointment = models.ForeignKey(Appointment)
    time = models.TimeField("Time before appointment we must notify the user")

这甚至是一种明智的做法吗?如果没有,我该怎么办呢?另外,为了通过管理控制台在Appointment的视图中查看NotificationNumber,我应该声明内联堆栈(从那时起Number - &gt ; Apppointment - > Notification,在Number的页面下查看时,将这些内容链接为内联的正确方法是什么?我知道[之前曾被问过](Nested inlines in the Django admin?)之类的东西,但是自从2010年被问到这个问题后,我很好奇是否有人找到了新方法,或者第二个答案是@在上述链接中的carruthd仍然是最好的方法。谢谢。

1 个答案:

答案 0 :(得分:0)

如果您想为每个约会提供更多通知,请添加指向其他模型的ManyToManyField(在这种情况下为Notification)。然后,您就可以通过这种方式获得所有即将发布的通知: Appointment.notifications_set.filter(notify_time__gte=now())

class Notification(models.Model):
    notify_time = models.DateTimeField("Notification datetime", db_index=True)

class Number(models.Model):
    number = models.CharField("Patient's Number", max_length=12, unique=True)

class Appointment(models.Model):
    to_number = models.ForeignKey(Number)
    message = models.CharField("Message", max_length=160)
    notifications = models.ManyToManyField(Notification, through=AppointmentNotifications)

class AppointmentNotifications(models.Model):
    notif = models.ForeignKey(Notification)
    appoint = models.ForeignKey(Appointment)

还有一个表:AppointmentNotifications,它将由Django创建,但是如果你自己创建它,你可以稍后添加一些列(即。notification_already_sent = models.BooleanField("User was informed"),你也可以可能希望将所有Notifications加入到每个Appointment作为内联:

admin.py:

class AppointmentNotificationInline(admin.TabularInline):
    model = AppointmentNotification

class AppointmentAdmin(admin.ModelAdmin):
    inlines = [AppointmentNotificationInline]