0

我有两个表“Event”和“GuestList”。在保存事件时,我们可以提及它是公共事件还是私人事件。如果是私人活动,我们必须有一个客人名单,如果不是,有一个客人名单是可选的。

现在

 1. how to check before saving the event whether the guest list is empty or not.? 
 2. how to relate those two tables.

我正在使用 django 框架和 postgresql 数据库。

  class Event(models.Model):
    user = models.ForeignKey(UserInfo, null=False)
    title = models.CharField(max_length=40)
    description = models.CharField(max_length=160)
    event_type = models.BooleanField(default=False)     #public or private 
    created = models.DateTimeField(auto_now_add=True)

  class GuestList(models.Model):
    user = models.ForeignKey(UserInfo, null=False)
    event = models.ForeignKey(Event, null=False)
    g_email = models.EmailField(null=False, blank=True, unique=True,
          validators=[validators.validate_email])
    g_name = models.CharField(max_length=40)
    attendence = models.CharField(max_length=100, choices=ATTENDENCE_STATUS, null=False)

对于一个活动,用户应该邀请一些客人如何查看私人活动是否有客人名单?

4

2 回答 2

0

@user2936254,据我了解,您的问题是-

  • 事件是在网站的单独 URL 上创建的
  • 访客列表添加在网站的单独 URL 上

因此,如果没有来宾列表,您将无法创建私人活动,如果没有创建活动,那么您将如何添加来宾列表。

我可以为这个问题提出 2 个解决方案 -

  1. 改变您网站的流程。

    • 创建活动并在同一 URL 上添加来宾列表
    • 或者当添加事件时,将事件详细信息放入会话中,一旦添加来宾列表,在数据库中创建实际事件以及来宾列表
  2. 更改您的数据库

    • 从 GuestList 表中删除事件。
    • 创建一个Event和GuestList的映射表,里面只有所有guest的eventid和guestlistid。这意味着事件和客人名单之间的一对多关系。
    • 现在您可以先保存来宾列表,然后再创建一个活动。

我希望我能正确理解你的问题

于 2013-12-18T10:48:35.850 回答
0

由于外键的工作方式(在保存之前需要相关表上的主键,因此必须先保存相关对象),您不能在创建(和保存)GuestList之前创建(和保存)对象一个Event对象。

但是,您可以编写一个自定义管理器对象来为您处理此逻辑,并始终使用它。像这样的东西(未经测试的代码):

class EventManager(models.Manager):
    def create_event(guest_list=None, **kwargs):
        guest_list = guest_list or []
        private = kwargs.get('event_type', False)
        if private and not guest_list:
            raise ValidationError('Cannot create a private event without a guest list')
        event = self.create(**kwargs)
        for guest in guest_list:
            guest.event = event
            guest.save()
        return event

class Event(models.Manager):
    objects = EventManager()
    # rest of you models...

这就是我将如何使用这样的经理:

在允许人们将客人添加到现有活动的视图中,像往常一样进行操作:

guest_list = GuestList(
    g_email = 'new.person@email.com',
    g_name = 'New Person',
    user = my_user,
    attendance = 'yes',
    event = the_event_to_add_to,
)
guest_list.save()

而对于添加一个全新的活动(或向一个尚不存在的活动添加来宾列表,同样的事情):

guest_list = None

if event_type == True: # private! Build up a guest list however you like
    guest_list = [
        GuestList(g_email='bob@bob.com', g_name='Bob', user=my_user, attendance='yes'),
        GuestList(g_email='dan@dan.com', g_name='Dan', user=my_user, attendance='yes'),
        GuestList(g_email='terry@terry.com', g_name='Terry', user=my_user, attendance='yes'),
    ]

event = Event.objects.create_event(
    user = my_user,
    title = 'My Awesome Event',
    description = 'This is going to be great',
    guest_list = guest_list,
    event_type = event_type
)
event.save()
于 2013-11-09T09:28:23.383 回答