Невозможно выполнить запрос "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(), когда вы хотите получить все объекты, соответствующие вашим параметрам поиска.