首页 > 解决方案 > 尝试在 Django 中创建以下关系时出现 ValueError

问题描述

我查看了类似的 SOverflow 问题,但没有任何帮助。我试图在按下按钮时创建关注者/关注者关系,通过 Javascript 传递信息...

function follow(user) {
    fetch(`/profile/${user.id}`, {
        method: 'POST',
        body: JSON.stringify({
            followed: user.id
        })
    })
        .then(response => response.json())
        .then(() => load_profile(user.id))
}

...然后我收到它并尝试保存或更新它...

@csrf_exempt
@login_required
def view_profile(request, user_id):
    if request.method == "POST":
        data = json.loads(request.body)
        followed = data.get("followed", "")
        follower = request.user.id
        obj, created = UserFollowing.objects.get_or_create(user_id=followed, following_user_id=follower, following=True)
        if not created:
            obj(following=False)
            obj.save()
        return JsonResponse({"message": "(Un)Followed successfully."}, status=201)

...这是模型:

class User(AbstractUser):
    pass

    def serialize(self):
        return {
            "id": self.id,
            "user": self.username,
            "following": self.following.count(),
            "followers": self.followers.count(),
        }

class UserFollowing(models.Model):
    user_id = models.ForeignKey(User, on_delete=models.CASCADE, related_name="following")
    following_user_id = models.ForeignKey(User, on_delete=models.CASCADE, related_name="followers")
    following = models.BooleanField(blank=False, default=True)

错误: ValueError: Cannot assign "3": "UserFollowing.user_id" must be a "User" instance. 我尝试传递不同的值,例如用户名、对象本身,但无济于事。

标签: pythondjango

解决方案


这一行:

followed = data.get("followed", "")

如果您的正文消息(数据)不包含后续关键字,则空字符串将分配给followed变量,否则将分配一个数字。

这两种情况都会让您稍后在这一行遇到麻烦,其中followed必须是用户对象并且不能是空字符串或数字。

obj, created = UserFollowing.objects.get_or_create(user_id=followed, following_user_id=follower, following=True)

您还将在以下行中遇到相同的错误,其中您为follower变量分配了一个数字,根据您的模型,该变量也必须是一个用户对象。

follower = request.user.id

可能的解决方案:

@csrf_exempt
@login_required
def view_profile(request, user_id):
    if request.method == "POST":
        data = json.loads(request.body)
        if "followed" in data: 
          followed = data["followed"]
          try:
            user = User.objects.get(id=followed)
          except:
            # user does not exist
        follower = request.user
        obj, created = UserFollowing.objects.get_or_create(user_id=user, following_user_id=follower, following=True)
        if not created:
            obj(following=False)
            obj.save()
        return JsonResponse({"message": "(Un)Followed successfully."}, status=201)

推荐阅读