Django模型查询关系,如何做正确的连接

balp4ylt  于 2022-11-18  发布在  Go
关注(0)|答案(1)|浏览(110)

假设我有两个Model:

class Auction(models.Model):
    seller = models.ForeignKey(User, on_delete=models.CASCADE, related_name="seller")
    title = models.CharField(max_length=64)

class Watchlist(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user_watchlist')
    auction = models.ForeignKey(Auction, on_delete=models.CASCADE, related_name='auction_watchlist')

该视图接收请求,创建一个具有拍卖对象的上下文变量,这些拍卖对象是:
1.与作出请求的用户相关联的
1.已添加到监视列表模型中,
将其发送到模板。
我已将视图设置为如下工作方式:

@login_required
def watchlist(request): 
    watchlist_objects = Watchlist.objects.filter(user=request.user)
    auction_objects = Auction.objects.filter(auction_watchlist__in=watchlist_objects).all()
    context = {'watchlist_auctions': auction_objects}
    print(context)
    return render(request, "auctions/watchlist.html", context)
  • 我进行第一个查询以获取与用户关联的监视列表中的项目列表。
  • 然后我用它从Auction Model中获取另一个查询,并将其传递给模板。
    在模板中,我可以访问Auction的属性来显示它们。(标题、作者和其他为了简单起见而没有包括的属性)
    问题是:这是正确的方法吗?是否有更好的方法从第一个监视列表查询访问拍卖中的属性?
    在我看来,我做的事情太复杂了。
qoefvg9y

qoefvg9y1#

考虑到它可能会作为一个查询来执行,这并不是很糟糕,因为查询集求值比较慢。如果已经有.filter(),可以跳过.all()
但是,有一种更方便的方法可以做到这一点,即使用跨关系的查找。

auction_objects = Auction.objects.filter(auction_watchlist__user_id=request.user.id)

相关问题