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相关的_名称不起作用_Python_Django_Model View Controller - Fatal编程技术网

Python 在多对多字段中使用自引用时,Django相关的_名称不起作用

Python 在多对多字段中使用自引用时,Django相关的_名称不起作用,python,django,model-view-controller,Python,Django,Model View Controller,我目前正在尝试在用户之间创建以下关系,所以我在用户模型中使用了多对多字段来引用它自己 class User(AbstractUser): followers = models.ManyToManyField('self', related_name='following') def __str__(self): return self.username 但是,当我使用shell测试此模型并尝试访问相关的_名称时,它报告发生了错误 >>> u1

我目前正在尝试在用户之间创建以下关系,所以我在用户模型中使用了多对多字段来引用它自己

class User(AbstractUser):
    followers = models.ManyToManyField('self', related_name='following')

    def __str__(self):
        return self.username
但是,当我使用shell测试此模型并尝试访问相关的_名称时,它报告发生了错误

>>> u1 = User.objects.get(pk=1)
>>> u1.following.all()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'User' object has no attribute 'following'
u1=User.objects.get(pk=1) >>>u1.following.all() 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 AttributeError:“用户”对象没有“以下”属性
现在我真的很困惑,真的需要帮助或其他方法来实现这一点。

如果多对多关系被赋予其他模型,则related_name属性指定从用户模型返回到您的模型的反向关系的名称

但在这种情况下。。。。。两种型号都一样

所以你试试这个

u1=User.objects.get(pk=1)
u1.followers.all()

我认为Django不允许我们在字段引用自身时给出相关的名称

对于这个特定的任务,我发现这个帖子很有用

他们实际上做的是创建另一个名为Following()的模型,并使用它来存储关系

class Following(models.Model):
    target = models.ForeignKey('User', on_delete=models.CASCADE, related_name = "followers")
    follower = models.ForeignKey('User', on_delete=models.CASCADE, related_name = "targets")

谢谢你的回答。u1.followers.all()为我工作。然而,我也想得到关于用户当前跟踪的用户的信息。。。我刚刚在网上找到了其他例子,它们创建了一个新的模型来存储关系,我认为这是实现这一点的更简单的方法。