Django:检查对象是否最后一次链接到另一个对象



我正在django(python(中编写一个删除函数
我需要删除一个网站。一个站点可以链接到多个组
在删除网站之前,我必须检查该网站是否是组中的最后一个网站
我正在考虑如何最有效地做到这一点
在删除网站并检查该网站是否是唯一链接的网站之前,是否应该查询该网站链接到的所有组的所有网站?

site = get_object_or_404(Site, pk=site_pk)
group = Group.objects.prefetch_related("user_site").filter(
user_site__site_id=site_pk
)
site.delete()

站点模型:-没有关系,只有基本属性

集团模式:

有一个名称和

def get_linked_sites(self):
user_sites = self.usersites.all()
return [usersite.usersite.site.id for usersite in user_sites]

UserSite型号:

user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="sites")
site = models.ForeignKey(Site, on_delete=models.CASCADE, related_name="users")
group = models.ForeignKey(
Group,
on_delete=models.SET_NULL,
related_name="user_site",
default=None,
blank=True,
null=True,
)

UserSiteGroup模型:

usersite = models.ForeignKey(
UserSite, on_delete=models.CASCADE, related_name="groups"
)
group = models.ForeignKey(Group, on_delete=models.CASCADE, related_name="usersites")

解决方案(但可能更好?(:

site = get_object_or_404(Site, pk=site_pk)
groups = (
Group.objects.filter(usersites__usersite__site_id=site_pk)
.prefetch_related("usersites__usersite")
.distinct()
.all()
)
for group in groups:
if len(group.get_linked_sites()) > 1:
group.delete()
site.delete()

我假设您对Group的定义有一个Site外键?如果是,您可以在那里添加或使用相关名称,例如

class Group(models.Model):
...
site = models.ForeignKey(Group, on_delete=models.CASCADE, related_name="groups")

然后你可以简单地使用进行检查

if not user_site.groups.all().exists():
user_site.delete()

您可以使用以下代码:

group = Group.objects.get(pk=site.group_id)
if group.site_set.exclude(pk=site.id).count == 0:
site.delete()
group.delete()

最新更新