Python 如何在保存前检查活动是否有来宾列表?

Python 如何在保存前检查活动是否有来宾列表?,python,django,python-2.7,django-models,Python,Django,Python 2.7,Django Models,我有两张桌子“事件”和“客人名单”。在保存事件时,我们可以提及它是公共事件还是私人事件。如果这是一个私人活动,我们必须有一个客人名单,如果不是,我们可以选择有一个客人名单 现在 我正在使用django框架和postgresql数据库 class Event(models.Model): user = models.ForeignKey(UserInfo, null=False) title = models.CharField(max_length=40) descr

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

现在

我正在使用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)

对于事件,用户应该邀请一些来宾如何查看私人事件是否有来宾列表?

由于外键的工作方式(在保存它们之前需要相关表上的主键,因此必须先保存相关对象),您无法创建(和保存)在创建(并保存)
事件
对象之前,先创建
访客列表
对象

但是,您可以编写一个自定义管理器对象来为您处理此逻辑,并始终使用它。类似于以下内容(未经测试的代码):

这就是我如何使用这样一位经理:

在允许人们将来宾添加到现有活动的视图中,按照通常的方式进行操作:

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()
对于添加一个全新的活动(或者向一个还不存在的活动添加一个客人列表,同样的事情):


@用户2936254,据我所知,您的问题是-

  • 事件在网站的单独URL上创建
  • 客人名单添加在网站的单独URL上
所以,若并没有来宾列表,你们就不能创建私人活动,若并没有创建活动,那个么你们将如何添加来宾列表

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

  • 更改网站的流量

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

    • 从来宾列表表中删除事件
    • 创建一个Event和GuestList的映射表,其中只包含所有来宾的eventid和GuestList。这意味着事件和来宾列表之间存在一对多关系
    • 现在,您可以先保存来宾列表,然后创建一个事件

  • 我希望我正确地理解了您的问题

    您能显示当前视图/模型的保存方法吗?是否使用表单?在管理层?您可以发布一些代码吗?不使用任何表单,我们将获得json数据,我们需要存储这些数据。您将无法确保在保存事件时存在来宾列表,因为您无法在保存事件对象之前创建来宾列表实例。Hi@Ben感谢您的回答,但有一点需要澄清,我必须为一个事件添加guest,该事件在调用用于添加guest的单独url时存在。,对于创建活动,将调用单独的url。但是,我既不能将来宾添加到不存在的活动中,也不能在不将来宾添加到活动中的情况下创建私人活动。你能帮我做些什么吗?我已尝试添加更多详细信息,说明如何使用经理实现您的目标-否则,你问的问题让我有点困惑:)我希望能有帮助?
    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()