【问题标题】:How to check whether an event has guest list or not before saving?如何在保存之前检查活动是否有来宾列表?
【发布时间】:2013-11-08 10:08:52
【问题描述】:

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

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

【问题讨论】:

  • 您能展示一下您当前拥有的视图/模型的保存方法吗?
  • 您在使用表单吗?在管理员?可以发一些代码吗?
  • 不使用任何形式,我们会得到json数据,我们需要存储它。
  • 保存事件时,您将无法确保存在来宾列表,因为您无法在保存事件对象之前创建 GuestList 实例。

标签: python django python-2.7 django-models


【解决方案1】:

由于外键的工作方式(在保存之前需要相关表上的主键,因此必须先保存相关对象),您不能在此之前创建(和保存)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()

【讨论】:

  • 嗨@Ben 感谢您的回答,但需要澄清一点,我必须为一个事件添加来宾,该事件在调用用于添加来宾的单独 url 时存在,并且用于创建事件单独的 url 将被调用。但是我既不能将客人添加到不存在的活动中,也不能在不向活动中添加客人的情况下创建私人活动。你能帮我吗?
  • 我已经尝试添加更多细节来说明我将如何使用管理器来实现您想要的 - 否则,我对您的要求有点困惑 :) 我希望它有所帮助?
【解决方案2】:

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

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

所以没有来宾列表你不能创建私人活动,如果没有创建活动那么你将如何添加来宾列表。

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

  1. 改变您网站的流程。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    • 2011-11-21
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    相关资源
    最近更新 更多