Django - Запрос по внешнему ключу в представлениях
Я пытаюсь сделать кнопку на посте, которая, когда пользователь нажимает на нее, запрашивает добавление в пост в качестве посещаемости, а затем, автор поста должен одобрить этот запрос.
Models.py
class Attending(models.Model):
is_approved = models.BooleanField(default=False)
attending = models.ManyToManyField(User, related_name='user_event_attending')
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField(blank=True)
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)
attending = models.ForeignKey(Attending, on_delete=models.CASCADE, verbose_name='atending', null=True)
Моя проблема в том, что каждый раз, когда я пишу запрос для кнопки, он выдает ошибку, и я не могу понять, как получить обратный внешний ключ.
Вот мой код на моем views.py
def request_event(request, pk):
previous = request.META.get('HTTP_REFERER')
try:
query = Attending.objects.get(pk=pk)
request_attending = query.post_set.add(request.user)
messages.success(request, f'Request sent!')
return redirect(previous)
except query.DoesNotExist:
return redirect('/')
Заранее большое спасибо за помощь!
Это: query.post_set - это просто отношения. Вы не можете вызвать метод add просто так. Вы можете добавить в отношение ManyToMany, и я полагаю, что вы хотите добавить пользователя в поле Attending.attending, а не непосредственно в объект Post. Измените это на:
...
query = Attending.objects.get(pk=pk)
query.attending.add(request.user)
messages.success(request, f'Request sent!')
....
| Обновление |
Думаю, вам стоит подумать о перестройке ваших отношений. Если я правильно понимаю ваш план, вам следует пойти таким путем:
class Attending(models.Model):
...
attendant = models.ForeignKey(User, related_name='events_attending', on_delete=models.CASCADE)
post = models.ForeignKey('Post', on_delete=models.CASCADE)
class Post(models.Model):
...
author = models.ForeignKey(User, on_delete=models.CASCADE)
Для одного Post объекта может быть много Attending объектов, тогда вы можете использовать отношения, подобные этому:
att = Attending.objects.first()
att.post # get related Post object from ForeignKey | there is only one
post = Post.objects.first()
post.attending_set.all() # get all related Attending objects
Post.objects.get(attending=att) # get Post object that the Attending object have in ForeignKey field
user = User.objects.first()
user.post_set.all() # get all Post objects that User is author in
user.events_attending.all() # get all related Attending objects
Для получения дополнительной информации проверьте Django Docs.