首页 > 解决方案 > 无法更新模型 ManyToMany 关系 django。收到一条错误消息,指出尚未定义模型字段

问题描述

我只是对此感到困惑或厌倦。当此代码运行时,它并不总是删除或添加,并且当它运行时,它不会更新点赞数。正如我看到的代码,当用户在喜欢的值中找到时,它应该删除用户并减少喜欢,反之亦然,它似乎没有这样做。我似乎也只能在所有图片中获得 1 个赞,所以我必须删除一个赞并添加到另一个赞,这似乎都是随机发生的。

    def liked_pic(request):
        pdb.set_trace()
        if request.method == 'POST':
            pic = Pictures.objects.get(id=request.POST.get('pic_id'))
            user = UserModel.objects.get(email=request.user)
            liked = Pictures.objects.filter(likes=user).exists()
            print(pic.likes, liked)
            if liked:
                pdb.set_trace()
                pic.likes.remove(user)
                pdb.set_trace()
                pic.save()
            if not liked:
                pdb.set_trace()
                pic.likes.add(user)
                pic.save()
            picturecount = Pictures.objects.filter(likes).count()
            data = {'json_pic_id': pic.id,'likes': picturecount, 'user':liked}
            return JsonResponse(data)
            return HttpResponseRedirect('home')


class Pictures(models.Model):
    image = models.ImageField(upload_to='static/dataset/')
    author = models.ForeignKey(UserModel,on_delete=models.CASCADE)
    likes = models.ManyToManyField(UserModel,default=False,blank=True,related_name='likes')       
    description = models.CharField(default=False,max_length=200)


class UserModel(AbstractBaseUser,PermissionsMixin):
    sys_id = models.AutoField(primary_key=True, blank=True)
    email = models.EmailField(max_length=127, unique=True, null=False, blank=False)
    username = models.CharField(max_length=30, unique=True)

    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)

    objects = MyUserManager()

    USERNAME_FIELD = "email"
    # REQUIRED_FIELDS must contain all required fields on your User model,
    # but should not contain the USERNAME_FIELD or password as these fields will always be prompted for.
    REQUIRED_FIELDS = ['is_staff']








    pdb trace-----------------

    System check identified no issues (0 silenced).
    January 06, 2020 - 09:50:49
    Django version 3.0, using settings 
    Starting development server at http://127.0.0.1:8000/
    Quit the server with CTRL-BREAK.
    **accounts.UserModel.None False**
    (Removed computer path information)
    **-> pic.likes.add(user)**
    (Pdb) continue
    [06/Jan/2020 09:51:05] "POST /liked/ HTTP/1.1" 200 44
    [06/Jan/2020 09:51:23] "GET /home/ HTTP/1.1" 200 3141
    [06/Jan/2020 09:51:23] "GET /media/static/dataset/00000016.png HTTP/1.1" 200 184935
    **accounts.UserModel.None True**
    (Removed computer path information)
    -> **pic.likes.remove(user)**
    (Pdb)
    (Pdb) continue





    -> pic.save()
    (Pdb) continue
    [06/Jan/2020 09:51:52] "POST /liked/ HTTP/1.1" 200 44

标签: djangopython-3.xmany-to-many

解决方案


在不了解有关该应用程序的更多详细信息的情况下,我认为您的逻辑略有偏差(显然,否则您不会有问题)。如果您单步执行您的liked_pic代码,您将执行以下操作:

  1. 把那个人喜欢的照片给我
  2. 获取我的登录用户
  3. 给我所有用户喜欢的图片
  4. 如果用户喜欢任何图片,则从这张图片中删除喜欢
  5. 如果用户点赞为零,则将点赞添加到当前图片

我认为您可能需要将您的liked线路更改为以下内容:

liked = Pictures.objects.filter(id=request.POST.get('pic_id'), likes=user).exists()

更具体地说,您需要检查用户是否喜欢那张图片,而不是所有图片。希望有帮助。


推荐阅读