64

我想在用户类对象之间创建多对多关系。

我有这样的事情:

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

问题是我是否可以在其内部使用类引用。还是我必须使用"self"insead of "MyUser"in ManyToManyField?还是有另一种(更好的)方法来做到这一点?

4

6 回答 6

89

从技术上讲,我很确定“MyUser”或“self”会起作用,只要它在任何一种情况下都是一个字符串。你只是不能通过MyUser实际的课程。

但是,文档总是使用“self”。使用“self”不仅更明确地说明实际发生的事情,而且不受类名更改的影响。例如,如果您后来更改MyUserSomethingElse,那么您还需要更新对“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

不要忘记使用symmetric=False,如果您对相关对象使用.clear() 或.add() 方法并且不希望关系另一侧的对象更新关系字段中的自己的数据。

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)

我在数据库中有这样的一条记录: 在此处输入图像描述

请注意,我使用 uuid 进行 pk,我使用 django 3.1

编辑:正如@shinra-tensei 在这个答案中作为评论解释的那样,symmetrical如果我们使用 self. 记录在Django 文档中:ManyToManyField.symmetrical

于 2020-10-21T09:19:24.520 回答
2

如果您使用selfMyUser在这两种情况下都会收到 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 回答