我想创建一个多对多的关系,从和到一个用户类对象。我有这样的东西:
class MyUser(models.Model): ... blocked_users = models.ManyToManyField(MyUser, blank=True, null=True)
问题是我是否可以在类本身内部使用类引用。或者我必须使用"self"代替ManyToManyField中的"MyUser"?或者有其他(更好)的方法吗?
"self"
ManyToManyField
"MyUser"
mrfwxfqh1#
从技术上讲,我很确定“MyUser”或“self”可以工作,只要它是一个字符串。但是,文档总是使用“self”。使用“self”不仅可以更明确地说明实际发生的情况,而且不会受到类名更改的影响。例如,如果您后来将MyUser更改为SomethingElse,则还需要更新对“MyUser”的任何引用。问题是,由于它是一个字符串,IDE不会提醒您错误。所以你错过它的可能性更大。使用“self”将工作,无论类的名称是现在或将来。
MyUser
SomethingElse
mznpcxlj2#
class MyUser(models.Model): ... blocked_users = models.ManyToManyField("self", blank=True)
rdlzhqv93#
不要忘记使用symmetric =False,如果你使用.clear()或.add()方法来处理相关对象,并且不希望关系另一端的对象更新自己在关系字段中的数据。
some_field = models.ManyToManyField('self', symmetrical=False)
ref:Django Documentation:ManyToManyField.symmetrical
nkhmeac64#
我认为应该是类名而不是self。因为像这样使用self
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在this answer中的注解所解释的,如果我们使用self,我们必须将symmetrical设置为False。ManyToManyField.symmetrical
symmetrical
cbwuti445#
如果使用self或MyUser,都会得到NameError,需要将**“self”**写成string,如下图所示:
class MyUser(models.Model): ... blocked_users = models.ManyToManyField("self", blank=True, null=True)
如果关系不对称,不要忘记将symmetric属性设置为False。有关更多详细信息,请查看:https://docs.djangoproject.com/en/3.0/ref/models/fields/#django.db.models.ManyToManyField
iyzzxitl6#
不要在ManyToManyField中使用'self',它会导致你的对象相互链接,当使用django表单提交它时
class Tag(models.Model): ... subTag = models.ManyToManyField("self", blank=True) ... aTagForm.save()
结果:
a.subTag == b b.subTag == a
6条答案
按热度按时间mrfwxfqh1#
从技术上讲,我很确定“MyUser”或“self”可以工作,只要它是一个字符串。
但是,文档总是使用“self”。使用“self”不仅可以更明确地说明实际发生的情况,而且不会受到类名更改的影响。例如,如果您后来将
MyUser
更改为SomethingElse
,则还需要更新对“MyUser”的任何引用。问题是,由于它是一个字符串,IDE不会提醒您错误。所以你错过它的可能性更大。使用“self”将工作,无论类的名称是现在或将来。mznpcxlj2#
rdlzhqv93#
不要忘记使用symmetric =False,如果你使用.clear()或.add()方法来处理相关对象,并且不希望关系另一端的对象更新自己在关系字段中的数据。
ref:Django Documentation:ManyToManyField.symmetrical
nkhmeac64#
我认为应该是类名而不是self。因为像这样使用self
当我添加父项时:
我在数据库中有2条记录,如下所示:
并使用类名称类似于:
我在数据库中有一个这样记录:
注意,我使用uuid作为pk,我使用django 3.1
编辑:正如@shinra-tensei在this answer中的注解所解释的,如果我们使用self,我们必须将
symmetrical
设置为False。ManyToManyField.symmetricalcbwuti445#
如果使用self或MyUser,都会得到NameError,需要将**“self”**写成string,如下图所示:
如果关系不对称,不要忘记将symmetric属性设置为False。
有关更多详细信息,请查看:https://docs.djangoproject.com/en/3.0/ref/models/fields/#django.db.models.ManyToManyField
iyzzxitl6#
不要在ManyToManyField中使用'self',它会导致你的对象相互链接,当使用django表单提交它时
结果: