【问题标题】:Django: How to delete a group which is related to a team?Django:如何删除与团队相关的组?
【发布时间】:2022-01-16 12:14:50
【问题描述】:

我想扩展 Django 的组模型。为此,我创建了一个 Team 类,它使用 OneToOne 字段引用组模型。按预期创建和更新工作,但我未能删除团队。

# teamapp/models.py
from django.db import models
from rules.contrib.models import RulesModel
from django.contrib.auth.models import Group


class Team(RulesModel):
    group = models.OneToOneField(
        Group,
        on_delete=models.CASCADE,
        primary_key=True,
    )
    name = models.CharField(max_length=80)

    def save(self, *args, **kwargs):
        self.update_or_create_group()
        return super().save(*args, **kwargs)

    def update_or_create_group(self, *args, **kwargs):
        team_group, _ = Group.objects.update_or_create(
            id=self.pk,
            defaults={"name": self.name},
        )
        self.group = team_group
# teamapp/signals.py
from django.db.models.signals import post_delete
from django.dispatch import receiver
from django.db import transaction
from django.contrib.auth.models import Group
from teamapp.models import Team


@receiver(post_delete, sender=Team)
def delete_group(sender, instance, **kwargs):
    # TODO: Use celery for async operation: https://docs.djangoproject.com/en/3.2/topics/db/transactions/
    transaction.on_commit(lambda: delete_group(instance))


def delete_group(team_instance):
    Group.objects.filter(id=team_instance.group.id).delete()

不知何故,信号没有触发。还有其他方法吗?

【问题讨论】:

  • 不确定有没有,但是怎么调用delete方法呢?从一个角度? urls 文件上有什么东西?

标签: python django signals one-to-one


【解决方案1】:

不确定这是否是一种可接受的方式,但我忘了加载信号。所以我已经通过apps.py文件加载了它。

# teamapp/apps.py
from django.apps import AppConfig


class TeamappConfig(AppConfig):
    default_auto_field = "django.db.models.BigAutoField"
    name = "teamapp"
    verbose_name = "Team"

    def ready(self):
        import teamapp.signals

【讨论】:

猜你喜欢
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
  • 1970-01-01
  • 2012-07-11
  • 2020-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多