Простая функция рейтинга от пользователя к пользователю в Django

Я пытаюсь добавить поле в мой Django Project, которое позволит пользователям оставлять отзыв на странице профиля другого пользователя. Я понимаю, что мне нужно два ForeignKeys в моем models.py, один для пользователя, который будет писать отзыв, а другой для профиля пользователя, на котором будет написан отзыв. Я пытался добавить Profile FK, но я не уверен, как это сделать, и даже не знаю, что включить под Profile class.

Это то, что я пробовал до сих пор, но я получаю ошибку, которая гласит:

ValueError at /profile/7/ Cannot assign "<User: username>": "Review.profile" должен быть экземпляром "Profile"

.

Мне также нужна помощь с моим views.py, потому что когда я играю вокруг сообщения об ошибке, я смог наконец опубликовать отзыв, но он появляется в профиле пользователя, который написал отзыв, вместо фактического профиля, в который я хотел его написать. Я новичок в кодинге и очень старался прочитать документацию django об этом, но я не могу пройти мимо этого.

models.py:

class User(AbstractUser):
    name = models.CharField(max_length=200, null=True)
    email = models.EmailField(unique=True, default='')
    avatar = models.ImageField(null=True, default="defaultDp.jpg")
    location = models.CharField(max_length=200, null=True)



class Profile(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)

class Review(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    profile = models.ForeignKey(Profile, on_delete=models.SET_NULL, null=True)
    reviewmsg = models.TextField(null=True, blank=True)
    updated = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return str(self.reviewmsg)

views.py:

def userProfile(request, pk):
user = User.objects.get(id=pk)
         rooms = user.room_set.all()
         reviews = user.review_set.all()
     
         if request.method == 'POST':
             review = Review.objects.create(
                 user=request.user,
                 profile=user,
                 reviewmsg=request.POST.get('reviewmsg')
             )
             return redirect('user-profile', pk=user.id)

         context = {'user':user, 'rooms':rooms, 'reviews':reviews}
         return render(request, 'pages/profile.html', context)

Если вы переименуете поля вашей модели, это может немного прояснить ситуацию. Здесь вы используете 'user' для обозначения как рецензента, так и рецензируемого.

Я бы рекомендовал что-то вроде следующего, чтобы сделать вещи более понятными:

class Review(models.Model):
    #user = models.ForeignKey(User, on_delete=models.CASCADE)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    profile = models.ForeignKey(Profile, on_delete=models.SET_NULL, null=True)
    ...

Теперь вы можете легче представить себе происходящее

def userProfile(request, pk):

user = User.objects.get(id=pk)
         rooms = user.room_set.all()
         #reviews = user.review_set.all()
         #this is where the problem lies. the only reverse foreign key 
         #from user to a User field in a Review model is to author! 
         #so you are getting all the reviews the user is the author of!
         #instead, try
         reviews = Review.objects.filter(profile__user = user)
         ...
Вернуться на верх