問題を理解しているかどうかわかりません。
これを行うことにより:
class Child:
guardians = models.ManyToManyField('Guardian', related_name='children')
class Guardian:
.... some other fields
# children = models.ManyToManyField(Child) <--- not needed
「子供は多くの保護者を持つことができ、保護者は多くの子供を持つことができる」と言っているようなものです。両方のモデルで宣言する必要はありません。
また、3番目の(中間)テーブルは、とにかく舞台裏でdjangoによって作成されます。これは、RDBMS で ManyToMany 関係をモデル化する方法だからです。
中間モデルを明示的に作成する唯一の理由は、特定の多対多の関係を説明する追加情報を追加する必要がある場合です。すなわち
class Child:
guardians = models.ManyToManyField('Guardian',
through='ChildGuardianMembership', related_name='children')
class Guardian:
.... some other fields
class ChildGuardianMembership:
child = models.ForeignKey(Child)
guardian = models.ForeignKey(Guardian)
created_at = models.DateTimeField(auto_now_add=True) # When was this relationship established?
その場合、明示的な中間モデルを宣言したため、これがガーディアンと子の間の関係を作成するときに使用するモデルであることに注意する必要があります。
例えば
ChildGuardianMembership.objects.create(child=child_inst, guardian=guardian_inst)
many2many リレーションシップ (上記のように) にフィールドを追加する方法については、こちらで説明しています