0

を介して関連する2つの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)

ご覧のとおり、 aは複数の sCardに現れることがあります。Board私が書きたいアルゴリズムは次のとおりです。

  1. Carda のすべてのsを削除しても問題ありませんBoardBoard空のままで、それだけです。
  2. を削除すると、別の に関連付けられていないBoardすべてのを削除する必要があります。CardsBoard

pre_delete私の最初のアイデアは、シグナルをオーバーライドする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)

これにより、ボードに関連するすべてのカードが選択され、複数のボードに関連付けられているカードが除外されます。(ボードの 1 つが現在のボードであることは既にわかっています) そして、それらを削除します。

.delete()これは、単一のボードで呼び出した場合にのみ呼び出されることを覚えておくことも重要です。クエリセットではありません。

EDIT:クエリセット.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 に答える