使用其他模型的Django模型选择

时间:2017-02-01 14:13:00

标签: python django class

日程表是我的模型,它将我的所有活动保存在一个地方(会议,假期,生日等),但我也希望每个活动都是模型,以便可以在自己的空间中查看。我如何将事件作为选择,以便当我在我的日程安排中添加特定事件时,在这种情况下 - 提醒,它会将提醒添加到我的日程安排和提醒中,但不会添加到度假或生日。

这是我到目前为止,我相信我会将个别事件放入SCHED_CHOICES但我不知道如何调用其中的模型以使其更新并将事件保存到特定模型而不仅仅时间表模型。

class Schedule(models.Model):
    SCHED_CHOICES = (

    )
    user = models.ForeignKey(User)
    time = models.DateTimeField()

2 个答案:

答案 0 :(得分:1)

  

我还希望每个事件都是模型,以便可以在自己的空间中查看。

我会从一个更简单的方法开始。只要您的个人事件没有完全不同的字段,就会使事情变得更容易处理。您可以在事件表中使用字段event_type

from django.db import models

# Do not call your model Schedule because that's what the whole table
# represents. The django models define only one entity of it.
# So Event would be a suitable name.
class Event(models.Model):
    EVENT_CHOICES = (
        ('meeting', 'Meeting'),
        ('vacation', 'Vacation'),
        ('birthday', 'Birthday'),
        # [...]
    )

    user = models.ForeignKey(User)
    time = models.DateTimeField()
    event_type = models.CharField(max_length=30, choices=EVENT_CHOICES)

要获得schedule,您可以执行此操作:

schedule = Event.objects.all()

现在你可以看到,为什么Schedule不是这个模型的好名字。您只有一个包含事件模型中所有事件的计划。

然后在您的观看次数中,您可以过滤事件,例如像这样:

birthdays_of_greg = Events.objects.filter(user__username='greg', event_type='birthday')

在这个简单的用例中不需要很多不同的模型。您可以创建仅显示生日,假期等的视图,或仅创建特定用户或其组合的事件。

如果您需要动态创建事件类型,可以创建EventType模型并将event_type CharField替换为ForeignKey:

from django.db import models


class Event(models.Model):
    # all your event fields

    event_type = models.ForeignKey('EventType')

class EventType(models.Model):
    name = models.CharField(max_length=50)

如果您想要真正提升,可以使用generic relations。这允许您将任何模型附加到具有通用外键的事件。

答案 1 :(得分:0)

我只会在event_category模型中添加Schedule字段,并选择“提醒”,“生日”等。然后,您可以按事件类别进行过滤:Schedule.objects.filter(event_category__exact='birthday')。< / p>

如果您真的想为每个事件类别设置单独的模型,那么您可以使用OneToOneField将记录链接在一起:

class Birthday(models.Model):
    event = models.OneToOneField(Schedule, on_delete='models.CASCADE')
    ...