Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 同一模型的Django多对多(m2m)关系_Python_Django_Django Models_Many To Many - Fatal编程技术网

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

Python 同一模型的Django多对多(m2m)关系,python,django,django-models,many-to-many,Python,Django,Django Models,Many To Many,我想创建一个从用户类对象到用户类对象的多对多关系 我有这样的想法: class MyUser(models.Model): ... blocked_users = models.ManyToManyField(MyUser, blank=True, null=True) 问题是我是否可以在类引用内部使用它。或者我必须在ManyToManyField中使用“self”插入“MyUser”?或者还有其他(更好的)方法吗?从技术上讲,我很确定“MyUser”或“self”会起作用,只

我想创建一个从用户类对象到用户类对象的多对多关系

我有这样的想法:

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

问题是我是否可以在类引用内部使用它。或者我必须在
ManyToManyField
中使用
“self”
插入
“MyUser”
?或者还有其他(更好的)方法吗?

从技术上讲,我很确定“MyUser”或“self”会起作用,只要在这两种情况下都是字符串。您不能传递实际的类
MyUser

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

但是,文档总是使用“self”。使用“self”不仅可以更明确地了解实际发生的情况,而且不会受到类名更改的影响。例如,如果您后来将
MyUser
更改为
SomethingElse
,则还需要更新对“MyUser”的任何引用。问题是,由于它是一个字符串,IDE不会提醒您该错误,因此丢失它的可能性更大。无论类的名称是现在还是将来,使用“self”都会起作用。

不要在许多域中使用“self”,当使用django表单提交时,它会导致对象相互链接

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

 ...
 aTagForm.save()
结果:

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

如果使用selfMyUser,则在这两种情况下都会出现名称错误。您应该将“self”写为字符串。请参见下面的示例:

class MyUser(models.Model):
    ...
    blocked_users = models.ManyToManyField("self", blank=True, null=True)
如果关系不对称,请不要忘记将symmetric属性设置为False


有关更多详细信息,请查看:

我认为应该是类名而不是self。因为像这样使用self

parent = models.ManyToManyField('self', null=True, blank=True)
添加父项时:

user1.parent.add(user2)
我在数据库中有2条记录如下:

与使用类名类似:

parent = models.ManyToManyField('User', null=True, blank=True)
我在数据库中有一条记录如下:

注意,我对pk使用uuid,并使用Django3.1

编辑:
正如@shinra tensei在中的注释所解释的,如果我们使用self,我们必须将
symmetric
设置为False。如果对相关对象使用.clear()或.add()方法,并且不希望关系另一端的对象更新关系字段中自己的数据,请不要忘记使用symmetric=False

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

“自我”不起作用。使用blocked_users=models.ManyToManyField(“MyUser”,blank=True,null=True)我没有说“MyUser”,我说的是“self”:
null=True
对manytomanyfields没有影响在同一个模型上定义多对多有什么用??任何人please@ParaM例如,如果您有一个树状结构。主产品有子产品等。“在同一模型上定义多对多有什么用?”,以允许每个用户拥有他们自己阻止(或跟随)的其他用户的列表。最佳用例是模型的树结构。在同一模型上定义多对多有什么用??任何人please@ParaM一个例子:一个你想指定“相关文章”的文章模型一个个人例子是一个代理,它有一个字段指定招募他们的代理。有什么建议吗?我从来没有遇到过问题。我在演示中发现了它,最后我使用ManyToManyField(“Tag”,blank=True)来修复它。如果您不希望对象相互链接,请在创建字段时使用参数
symmetric=False
,它的存在是为了允许您使用
'self'
名称而不是模型名称。您使用的是什么数据库适配器?可能里面有个bug…@Ron postgres和mysql