Django多对多(m2m)与同一模型的关系

neskvpey  于 2023-03-31  发布在  Go
关注(0)|答案(6)|浏览(130)

我想创建一个多对多的关系,从和到一个用户类对象。
我有这样的东西:

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

问题是我是否可以在类本身内部使用类引用。或者我必须使用"self"代替ManyToManyField中的"MyUser"?或者有其他(更好)的方法吗?

mrfwxfqh

mrfwxfqh1#

从技术上讲,我很确定“MyUser”或“self”可以工作,只要它是一个字符串。
但是,文档总是使用“self”。使用“self”不仅可以更明确地说明实际发生的情况,而且不会受到类名更改的影响。例如,如果您后来将MyUser更改为SomethingElse,则还需要更新对“MyUser”的任何引用。问题是,由于它是一个字符串,IDE不会提醒您错误。所以你错过它的可能性更大。使用“self”将工作,无论类的名称是现在或将来。

mznpcxlj

mznpcxlj2#

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

rdlzhqv93#

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

some_field = models.ManyToManyField('self', symmetrical=False)

ref:Django Documentation:ManyToManyField.symmetrical

nkhmeac6

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

cbwuti44

cbwuti445#

如果使用selfMyUser,都会得到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

iyzzxitl

iyzzxitl6#

不要在ManyToManyField中使用'self',它会导致你的对象相互链接,当使用django表单提交它时

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

 ...
 aTagForm.save()

结果:

a.subTag == b
 b.subTag == a

相关问题