簡體   English   中英

Django - 在視圖中通過外鍵查詢

[英]Django - Query by foreign key in views

我正在嘗試在帖子上制作一個按鈕,當用戶點擊它時,請求將其作為出席添加到帖子中,然后帖子的作者必須批准該請求。

模型.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 object。將其更改為:

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

| 更新 |

我認為你應該考慮重新安排你的關系。 如果我了解你的計划,你應該這樣撥打 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)

對於一個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

有關更多信息,請查看Django 文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM