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

标签 python 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()

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/

相关文章:

python - 我可以使用 OneToOneField 的反向关系吗

python - python中的字母位置

python - 打印文本文件中的最小数值

python - pycharm 在模块导入解析中显示错误,即使程序运行正常

Python。获取对象的大小

python - 如何调用函数以特定模式在图形窗口中运行?

django - 查询 django 模型以查找当月最好的公司销售

python - 如何使用包含该模型查询集的列表序列化模型?

mysql - Django 模型创建时的竞争条件

python - 如何包含要查找的列,但将其从 GROUP BY 中排除?