我想在用户类对象之间创建多对多关系。
我有这样的事情:
class MyUser(models.Model):
...
blocked_users = models.ManyToManyField(MyUser, blank=True, null=True)
问题是我是否可以在其内部使用类引用。还是我必须使用"self"
insead of "MyUser"
in ManyToManyField
?还是有另一种(更好的)方法来做到这一点?
我想在用户类对象之间创建多对多关系。
我有这样的事情:
class MyUser(models.Model):
...
blocked_users = models.ManyToManyField(MyUser, blank=True, null=True)
问题是我是否可以在其内部使用类引用。还是我必须使用"self"
insead of "MyUser"
in ManyToManyField
?还是有另一种(更好的)方法来做到这一点?
从技术上讲,我很确定“MyUser”或“self”会起作用,只要它在任何一种情况下都是一个字符串。你只是不能通过MyUser
实际的课程。
但是,文档总是使用“self”。使用“self”不仅更明确地说明实际发生的事情,而且不受类名更改的影响。例如,如果您后来更改MyUser
为SomethingElse
,那么您还需要更新对“MyUser”的任何引用。问题是因为它是一个字符串,你的 IDE 不会提醒你错误,所以你错过它的可能性更大。无论现在或将来类的名称是什么,使用“self”都将起作用。
class MyUser(models.Model):
...
blocked_users = models.ManyToManyField("self", blank=True)
不要忘记使用symmetric=False,如果您对相关对象使用.clear() 或.add() 方法并且不希望关系另一侧的对象更新关系字段中的自己的数据。
some_field = models.ManyToManyField('self', symmetrical=False)
我认为它应该是类名而不是自我。因为像这样使用自我
parent = models.ManyToManyField('self', null=True, blank=True)
当我添加父母时:
user1.parent.add(user2)
并使用像这样的类名:
parent = models.ManyToManyField('User', null=True, blank=True)
请注意,我使用 uuid 进行 pk,我使用 django 3.1
编辑:正如@shinra-tensei 在这个答案中作为评论解释的那样,symmetrical
如果我们使用 self. 记录在Django 文档中:ManyToManyField.symmetrical
如果您使用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
不要在 ManyToManyField 中使用 'self',这会导致你的对象相互链接,当使用 django 表单提交时
class Tag(models.Model):
...
subTag = models.ManyToManyField("self", blank=True)
...
aTagForm.save()
结果:
a.subTag == b
b.subTag == a