64

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

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

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

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

4

6 に答える 6

89

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

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

于 2012-07-30T14:43:06.563 に答える
50
class MyUser(models.Model):
    ...
    blocked_users = models.ManyToManyField("self", blank=True)
于 2012-07-30T12:06:43.983 に答える
8

関連オブジェクトに.clear()または.add()メソッドを使用し、リレーションの反対側のオブジェクトがリレーションフィールドの独自のデータを更新したくない場合は、symmetric=Falseを使用することを忘れないでください。

some_field = models.ManyToManyField('self', symmetrical=False)
于 2021-03-28T09:10:11.200 に答える
5

自分ではなくクラス名にすべきだと思います。このように自分を使って

parent = models.ManyToManyField('self', null=True, blank=True)

親を追加するとき:

user1.parent.add(user2)

私はこのようなデータベースに2つのレコードを持っています: ここに画像の説明を入力してください

クラス名を使用すると、次のようになります。

parent = models.ManyToManyField('User', null=True, blank=True)

私はこのようなデータベースに1つのレコードを持っています: ここに画像の説明を入力してください

pkにはuuidを使用し、django3.1を使用していることに注意してください

編集:この回答のコメントとして@ shinra-tenseiが説明したようsymmetricalに、selfを使用する場合はFalseに設定する必要があります。Djangoドキュメントに記載されています:ManyToManyField.symmetrical

于 2020-10-21T09:19:24.520 に答える
2

selfまたはMyUserを使用すると、どちらの場合もNameErrorが発生します。「self」は文字列として書く必要があります。以下の例を参照してください。

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

また、関係が対称でない場合は、対称属性をFalseに設定することを忘れないでください。

詳細については、https ://docs.djangoproject.com/en/3.0/ref/models/fields/#django.db.models.ManyToManyFieldを確認してください。

于 2020-05-11T14:35:42.103 に答える
0

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

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

 ...
 aTagForm.save()

結果:

 a.subTag == b
 b.subTag == a
于 2019-06-11T04:09:16.723 に答える