首页 > 解决方案 > “ForwardManyToOneDescriptor”对象没有属性“pk”

问题描述

如下行中的错误:“ForwardManyToOneDescriptor”对象没有属性“pk”

 friend_user = User.objects.get(pk=Friend.to_user.id)

提前谢谢你,

模型.py

 class Friend(models.Model):
    status = models.CharField(max_length=10)
    from_user = models.ForeignKey(AUTH_USER_MODEL, on_delete=models.CASCADE, related_name = 'from_user')
    to_user = models.ForeignKey(AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="to_user")
    date_modified = models.DateTimeField(auto_now=True, blank=True)
    date_created = models.DateTimeField(auto_now_add=True, null=True)

   def __str__(self):
      return self.to_user.email

标签: djangopython-3.6

解决方案


related_name指定目标模型中关系的名称,因此您的

to_user = models.ForeignKey(
   AUTH_USER_MODEL, 
   on_delete=models.CASCADE, 
   related_name="to_user"  # <-- confusing relation name
)

添加一个关系User.to_user。这是一个令人困惑的名称,因为这to_user实际上与Friend. 并且因为外键在技术上允许多个朋友引用同一个用户,所以它应该是复数。

所以一个更好的名字应该是to_friends,它增加了Friend.to_userand User.to_friends

to_user = models.ForeignKey(
    AUTH_USER_MODEL, 
    on_delete=models.CASCADE, 
    related_name="to_friends"  # <-- better relation name
)

如果您更改了关系的名称,您可以使用以下命令找到给定用户的朋友:

friend = User.to_friends.get(id=...)

假设用户实际上有这个朋友。如果没有,你会得到一个Friend.DoesNotExist例外。如果您想避免这种情况并结识None朋友,请使用:

friend = User.to_friends.filter(id=...).first()
if friend is not None:
   ... # Do something with friend.

推荐阅读