如何在保存之前检查事件是否有访客列表?

时间:2013-11-08 10:08:53

标签: python django python-2.7 django-models

我有两个表“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)

对于某个活动,用户应该邀请一些客人如何查看私人活动是否有来宾列表?

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

@ user2936254,根据我的理解你的问题是 -

  • 在网站的单独网址上创建活动
  • 访客列表添加在网站的单独网址

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

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

  1. 更改您网站的流程。

    • 创建活动并在同一网址上添加访客列表
    • 或者在添加事件时将事件详细信息放入会话中,并在添加访客列表后在数据库中创建实际事件以及访客列表
  2. 更改数据库

    • 从GuestList表中删除事件。
    • 创建一个Event和GuestList的映射表,它只包含所有guest虚拟机的eventid和guestlistid。这意味着事件和嘉宾列表之间的一对多关系。
    • 现在您可以先保存Guestlist,然后创建一个Event。
  3. 我希望我能正确理解你的问题