我正在 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()
field 模型: - 没有关系,只有基本属性
群组模型:
有一个名字并且
def get_linked_sites(self):
user_sites = self.usersites.all()
return [usersite.usersite.site.id for usersite in user_sites]
用户站点模型:
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()
最佳答案
我假设您对组的定义有一个站点外键?如果是这样,您可以在那里添加或使用相关名称,例如
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()
关于python - Django:检查对象是否最后一个链接到另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60391001/