gpt4 book ai didi

Django左连接m2m字段

转载 作者:行者123 更新时间:2023-12-02 20:01:01 25 4
gpt4 key购买 nike

这是我的模型:

class User(models.Model):
pass

class Item(models.Model):
pass

class ItemVote(models.Model):
user = models.ForeignKey(User)
item = models.ForeignKey(Item)
vote = models.BooleanField()

我想检索项目列表,并且想知道当前用户是否为每个项目投票。如何更改我的查询对象,以便它生成类似于以下内容的 sql:

SELECT ...
FROM items
LEFT OUTER JOIN item_votes ON (item_votes.user_id = ? AND
item_votes.item_id = items.id)

最佳答案

你不能在普通的 django 查询中。这是一个多对多的关系,您甚至可以通过执行以下操作来更清楚地指定它:

class Item(models.Model):
votes = models.ManyToManyField(User, through='ItemVote', related='votedItems')

在多对多关系中,我们可以谈论相关集(因为有多个对象)。虽然 django 可以过滤相关集,例如:

Item.objects.filter(votes=request.user)

这将返回用户投票的所有项目。但是,当您在这些对象中列出 .votes 属性时,您将获得为该项目投票的所有用户。过滤是针对原始对象,而不是针对相关集。

以纯粹的 django 方式,您可以将我之前的 Item 类扩展为:

class Item(models.Model):
votes = models.ManyToManyField(User, through='ItemVote', related='votedItems')

def markVoted(self, user):
self.voted = user in self.votes

然后为每个对象调用此方法。然而,这将为每个对象的投票集创建一个额外的查询(不,select_lated 不适用于多对多关系)。

解决这个问题的唯一方法是使用 extra method 添加一些 SQL 到您的查询集中。 ,像这样:

Item.objects.extra('voted' : 'SELECT COUNT(*) FROM app_itemvote WHERE app_itemvote.item_id = app_item.id AND app_itemvote.user_id=%d'%request.user.pk)

关于Django左连接m2m字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2845355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com