【问题标题】:'ForwardManyToOneDescriptor' object has no attribute 'pk'“ForwardManyToOneDescriptor”对象没有属性“pk”
【发布时间】:2019-11-17 07:10:20
【问题描述】:

错误如下: “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

【问题讨论】:

  • 展示你的模型会有用。

标签: django python-3.6


【解决方案1】:

使用 'id' 而不是 'pk',如果 Friend 是您的另一个模型,则需要获取 Friend 类的实例。这样您就可以访问属性

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

【讨论】:

  • 'ForwardManyToOneDescriptor' 对象没有属性 'id'
【解决方案2】:

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_userUser.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.

【讨论】:

    猜你喜欢
    • 2021-03-11
    • 2021-02-13
    • 2021-06-18
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    相关资源
    最近更新 更多