web-dev-qa-db-ja.com

Django多対多(m2m)同じモデルとの関係

ユーザークラスオブジェクトとの間で多対多の関係を作成したいと思います。

私はこのようなものを持っています:

class MyUser(models.Model):
    ...
    blocked_users = models.ManyToManyField(MyUser, blank=True, null=True)

問題は、内部でクラス参照を使用できるかどうかです。または、ManyToManyField"self"の代わりに"MyUser"を使用する必要がありますか?それとも別の(そしてより良い)方法がありますか?

39
Ron

技術的には、どちらの場合でも文字列である限り、「MyUser」または「self」が機能することはかなり確信しています。実際のクラスであるMyUserを渡すことはできません。

ただし、ドキュメントは常に「自己」を使用します。 「自己」の使用は、実際に何が起こっているかをより明確にするだけでなく、クラス名の変更に影響されません。たとえば、後でMyUserSomethingElseに変更した場合、「MyUser」への参照も更新する必要があります。問題は、文字列であるため、IDEはエラーを警告しないため、見逃す可能性が高くなることです。 "self"を使用すると、クラスに関係なく機能します '名前は現在または将来です。

64
Chris Pratt
class MyUser(models.Model):
    ...
    blocked_users = models.ManyToManyField("self", blank=True)
37
Goin

manyToManyFieldで「self」を使用しないでください。Djangoフォームを使用して送信すると、オブジェクトが相互にリンクします。

class Tag(models.Model):
    ...
    subTag = models.ManyToManyField("self", blank=True)

 ...
 aTagForm.save()

そして結果:

 a.subTag == b
 b.subTag == a
0
ruandao