Невозможно выполнить запрос "ahmed": Должен быть экземпляр "Пользователь"

когда я передаю пользователя, приходит вот такая ошибка Невозможно запросить "ahmed": Должен быть экземпляр "User".

мой код такой

def user_add_post(sender, instance, *args, **kwargs):
        post = instance
        profile = Profile.objects.all()
        users = Profile.objects.filter(following=post.author.user)
        for u in users:
            user = Profile.objects.filter(following=u)
        sender = post.author.user
        text_preview = post.title[:50]
        notify = Notifications(post=post, sender= sender, user = user, text_preview=text_preview, notifications_type=1 )
        notify.save()

и проблема в user = Profile.objects.filter(following=u)

и если я изменю его на user = Profile.objects.filter(following=u.user) Невозможно присвоить "<QuerySet []>": "Notifications.user" должен быть экземпляром "User".

это модели приложения уведомлений


class Notifications(models.Model):
    NOTIFICATIONS_TYPES = ((1,'Post'), (2, 'Comment'), (3, 'Follow'))

    post = models.ForeignKey('post.Post', on_delete=models.CASCADE, related_name='noti_post', blank=True, null=True)
    sender= models.ForeignKey(User, on_delete=models.CASCADE, related_name='noti_from_user')
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='noti_to_user')
    notifications_type = models.IntegerField(choices=NOTIFICATIONS_TYPES)
    text_preview = models.CharField(max_length=50, blank=True)
    date = models.DateTimeField(auto_now_add=True)
    is_seen = models.BooleanField(default=False)

и это мой профиль модели

class Profile(models.Model):
    user = models.OneToOneField(User, verbose_name='user', on_delete=models.CASCADE)
    following = models.ManyToManyField(User, related_name='following', blank=True)
    avatar = models.ImageField(default='default.jpg', upload_to='profile_images')
    bio = models.TextField(default='this is your bio you can edit it if you want.', blank=True)

    users = Profile.objects.filter(following=post.author.user)
    for u in users:
        user = Profile.objects.filter(following=u)

u - это не экземпляр пользователя, это экземпляр профиля. Таким образом, вы запрашиваете Profile с профилем. Я не знаю, чего вы пытаетесь добиться, но в цикле попробуйте следующее:

for u in users:
        users = Profile.objects.filter(following=u.user))

Ваш вопрос довольно неясен. Вот основная концепция. Когда вы хотите отфильтровать данные для определенного пользователя, всегда используйте get вместо filter. В вашем случае вы хотите отфильтровать данные для конкретного пользователя. Такой подход является неправильным:

profile = Profile.objects.all()
users = Profile.objects.filter(following=post.author.user)

Как вы видите, профиль имеет пользовательский FK (Foreign Key), чтобы получить доступ к профилю конкретного человека/пользователя, выполните следующие действия: Получить профиль текущего вошедшего пользователя:

profile_user = Project.objects.get(user=self.request.user)

Чтобы получить профиль человека, чей пост/блог вы читаете. Вот шаги, которые вы можете выполнить:

1- С помощью модели Post получить доступ к идентификатору или экземпляру владельца поста

2- Затем напишите такой запрос, чтобы получить доступ к профилю владельца поста.

post_owner = some_user_instance
profile_user = Project.objects.get(user=post_owner)

Вот разница между get и filter:

**get(kwargs)

Возвращает объект, соответствующий заданным параметрам поиска, которые должны быть в формате, описанном в Field lookups. get() вызывает исключение MultipleObjectsReturned, если было найдено более одного объекта. Исключение MultipleObjectsReturned является атрибутом класса модели.

**filter(kwargs)

Возвращает новый QuerySet, содержащий объекты, соответствующие заданным параметрам поиска.

Короче говоря, используйте get(), когда вы хотите получить один уникальный объект, и filter(), когда вы хотите получить все объекты, соответствующие вашим параметрам поиска.

Вернуться на верх