通过ManyToManyField删除django中的相关模型

时间:2013-09-20 10:16:54

标签: django django-models

我有两个通过ManyToManyField

相关的Django模型
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)

正如您所看到的,Card可以出现在多个Board中。我想写的算法如下:

  1. 如果我删除了Card中的所有Board,那就没问题了。 Board仍然是空的,就是这样。
  2. 如果我删除Board,则必须删除未附加到其他Cards的所有Board
  3. 我的第一个想法是覆盖pre_delete上的Board信号,但我不确定这是否是最佳方式。

1 个答案:

答案 0 :(得分: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()