我有一个模型(事件),它具有用户模型(事件所有者)的ForeignKey。 此用户可以使用以下ManyToManyField邀请其他用户:
invites = models.ManyToManyField(
User, related_name="invited_users",
verbose_name=_("Invited Users"), blank=True
)
此invite字段生成一个简单的表,其中包含ID、事件ID和用户ID
如果事件所有者删除其配置文件,我不希望删除事件,而是将所有权传递给第一个被邀请的用户
所以我提出了这个函数:
def get_new_owner():
try:
invited_users = Event.objects.get(id=id).invites.order_by("-id").filter(is_active=True)
if invited_users.exists():
return invited_users.first()
else:
Event.objects.get(id=id).delete()
except ObjectDoesNotExist:
pass
这将查找事件实例,并返回按Invite表ID排序的活动受邀请用户,因此我可以获取此查询集的第一项,它对应于第一个受邀请的用户
为了在用户被删除时运行该函数,我在_delete=models.SET上使用了:
owner = models.ForeignKey(User, related_name='evemt_owner', verbose_name=_("Owner"), on_delete=models.SET(get_new_owner()))
然后我遇到了一些问题:
有什么想法吗
首先,我们可以为
Owner
字段定义一个策略,该字段将使用已更新的对象调用函数。我们可以定义这样的删除,例如在<i.app_name/deletion.py
文件中:您应该将一个可调用的传递给
SET
,而不是调用该函数,因此您可以将其实现为:因此,我们将在这里查看寻找要将对象传输到的用户的邀请。也许您需要从
.inivites
集合中排除get_new_owner
中事件的当前.owner
作为@AbdulAzizBarkat says,我们可以更好地使用级联,而不是显式删除
Event
对象,因为这将避免无限递归,其中User
删除触发可能触发Event
删除的Event
删除:目前这是不可能的,但稍后如果实现额外的逻辑,可能会在这种情况下结束。在这种情况下,我们可以使用:并将
get_new_owner
重写为:相关问题 更多 >
编程相关推荐