我有两个通过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)
正如您所看到的,Card
可以出现在多个Board
中。我想写的算法如下:
Card
中的所有Board
,那就没问题了。 Board
仍然是空的,就是这样。Board
,则必须删除未附加到其他Cards
的所有Board
。我的第一个想法是覆盖pre_delete
上的Board
信号,但我不确定这是否是最佳方式。
答案 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()