0

我有两个通过 a 相关的 Django 模型ManyToManyField

class Board(models.Model):
    name = models.CharField(max_length=100, blank=False)

class Card(models.Model):
    title = models.CharField(max_length=100, blank=False)
    boards = models.ManyToManyField(Board)

可以看到,aCard可以出现在几个Boards 中。我想写的算法如下:

  1. 如果我删除Carda 中的所有 s Board,就可以了。Board剩下的都是空的,仅此而已。
  2. 如果我删除 a ,则必须删除Board所有Cards未附加到另一个的。Board

我的第一个想法是覆盖pre_delete信号 on Board,但我不确定这是否是最好的方法。

4

1 回答 1

1

你可以做它板.delete()。像这样的东西:

def delete(*args, **kwargs):
    self.card_set.annotate(board_count=Count('boards')).filter(board_count=1).delete()
    super(Board, self).delete(*args, **kwargs)

这将选择所有与板相关的卡,然后过滤掉与多个板关联的卡。(您已经知道其中一个板是当前板)然后删除它们。

.delete()同样重要的是要记住,只有当您在单个板上调用时才会调用它。不在查询集上。

编辑:由于在调用查询集.delete()时不调用,我认为信号将是一个更好的选择:.delete()pre_delete

@receiver(pre_delete, sender=Board)
def delete_associated_cards(sender, instance, using, **kwargs):
    instance.card_set.annotate(board_count=Count('boards')).filter(board_count=1).delete()
于 2013-09-20T11:32:44.967 回答