python - 尝试在 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.
我尝试传递不同的值,例如用户名、对象本身,但无济于事。
解决方案
这一行:
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)
推荐阅读
- r - 如何选择具有相同数字绝对值的行
- dataset - 报表服务器 2016 无法从共享数据集中加载数据
- reactjs - 用 Jest 反应单元测试 - 模拟 localStorage 的问题
- java - 如何在此应用程序中添加在前台花费的总时间而不是上次使用的时间?
- android - Google Play 开发者控制台中的奇怪统计数据
- reactjs - 在反应应用程序中使用轮播时出错
- mysql - 如何修复学说(Symfony 4)中发生的异常?
- node.js - 在 nodejs 上使用 javascript 开发“分类”应用程序
- spring - Spring Batch - 从另一个具有重试机制的Tasklet调用Tasklet?
- python - 自动检测图像和视频文件以进行进一步处理