简体   繁体   English

Django - 在视图中通过外键查询

[英]Django - Query by foreign key in views

I am trying to make a button on the post that when a user cliks on it, is requesting to be added to the post as an attendance and then, the author of the post has to approve that request.我正在尝试在帖子上制作一个按钮,当用户点击它时,请求将其作为出席添加到帖子中,然后帖子的作者必须批准该请求。

Models.py模型.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)

My problem here is that every time I writte a query for the button is giving me erros and I couldn`t figure it out how to get the reverse of the foreign key.我的问题是,每次我为按钮写一个查询时都会给我错误,我无法弄清楚如何获得外键的反向。

This is my code on my views.py这是我在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('/')

Thank you very much for your help in advance!非常感谢您的提前帮助!

This: query.post_set is just relationship.这: query.post_set只是关系。 You cannot call method add just like that.您不能像那样调用方法add You can add to ManyToMany relation and I believe you want to add user to Attending.attending field, not directly to Post object. Change that to:您可以添加到ManyToMany关系,我相信您想将用户添加到Attending.attending字段,而不是直接添加到Post object。将其更改为:

...
query = Attending.objects.get(pk=pk)
query.attending.add(request.user)
messages.success(request, f'Request sent!')
....

| | Update |更新 |

I think you should consider rearraning your relationships.我认为你应该考虑重新安排你的关系。 If I understand your plan, you should go this way:如果我了解你的计划,你应该这样拨打 go:

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)

For one Post object there can be many Attending objects, then you can use relations like that:对于一个Post object 可以有多个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

For more check Django Docs .有关更多信息,请查看Django 文档

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM