django-消除重复的相关项目

django-消除重复的相关项目,django,Django,以下是我的应用程序中的一个片段: class PortolioItem(models.Model): ... user = models.ForeignKey(User) contract = models.ForeignKey(Contract) quantity = models.IntegerField(...) ... class Contract(models.Model): ... market = models.Foreig

以下是我的应用程序中的一个片段:

class PortolioItem(models.Model):
    ...
    user = models.ForeignKey(User)
    contract = models.ForeignKey(Contract)
    quantity = models.IntegerField(...)
    ...

class Contract(models.Model):
    ...
    market = models.ForeignKey(Market)
    ...
您可以看到,用户拥有的PortfolioItem数量与他拥有的不同合同数量相同

我想给在他们的投资组合中有特定“市场”的任何“合同”的用户发送电子邮件。我只想给用户发一次电子邮件,不管他可能拥有该市场多少种不同类型的合同。我是这样做的:

#get users that want to receive notices
users = User.active_users.investment_notices_users()
#get portfolio items for a specific market
market = Market.objects.get(pk=1)
portfolio_items = PortfolioItem.objects.filter(contract__in = market.contracts.all(), user__in = users)
由于用户可以拥有同一市场的不同类型的合同,queryset可能包含一个用户不止一次。我可以用几种方法消除重复用户(一种简单的解决方案似乎是:queryset-->list-->set-->list),但我想知道我是否使用了一种低效/不优雅的解决方案,是否有更好的ORM方法可以为我提供唯一的用户queryset


提前感谢。

如果您只需要用户,那么最好从用户表开始:

users = User.objects.filter(portfolioitem__contract__market=market)

如果您只是想要用户,那么最好从用户表开始:

users = User.objects.filter(portfolioitem__contract__market=market)

investment\u notices\u users
是某种管理者吗?看看它是如何定义的可能会有帮助。是的,它相当基本,返回相关布尔字段设置为true的用户:返回self。过滤器(userprofile\uuuu receives\u investment\u notices=true)是
investment\u notices\u users
某种管理器?查看它的定义可能会有所帮助。是的,它相当基本,返回相关布尔字段设置为true的用户:返回self.filter(userprofile\uuuu receives\u investment\u notices=true)这是否意味着我们可以使用相关集进行筛选?这就是我一直在寻找的,我并不知道它的存在。ORM文档中有没有提到这一点?是的,绝对有。看这里:这是否意味着我们可以使用相关的集合进行过滤?这就是我一直在寻找的,我并不知道它的存在。ORM文档中有没有提到这一点?是的,绝对有。看这里: