Python 如何在保存前检查活动是否有来宾列表?
我有两张桌子“事件”和“客人名单”。在保存事件时,我们可以提及它是公共事件还是私人事件。如果这是一个私人活动,我们必须有一个客人名单,如果不是,我们可以选择有一个客人名单 现在 我正在使用django框架和postgresql数据库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
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()