Джанго - устранение дубликатов связанных предметов

Вот фрагмент из моего приложения:

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

class Contract(models.Model):
    ...
    market = models.ForeignKey(Market)
    ...

Вы можете видеть, что пользователь имеет такое же количество PortfolioItems, что и количество различных контрактов, которыми он владеет.

Я хочу по электронной почте пользователям, у которых есть какие-либо "контракты" определенного "рынка" в их портфелях. И я хочу отправить электронное письмо пользователю только один раз, независимо от того, сколько разных типов контрактов на этом рынке он может иметь. Вот что я делаю:

#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 -> list -> set -> list), но мне интересно, если я нахожусь в неэффективном / не элегантном решении, и может быть лучше ORM способ, который даст мне уникальный пользовательский набор запросов.

Заранее спасибо.

13.10.2009 07:14:49
Какой- investment_notices_usersто менеджер? Может быть полезно увидеть, как это определяется.
Dominic Rodger 13.10.2009 07:43:30
да, это довольно простое, возвращает пользователи , которые имеют соответствующий набор булева поля верно: возвращение self.filter (userprofile__receives_investment_notices = True)
shanyu 13.10.2009 07:47:07
1 ОТВЕТ
РЕШЕНИЕ

Если вы просто хотите, чтобы пользователи, то лучше всего начать с таблицы User:

users = User.objects.filter(portfolioitem__contract__market=market)
1
13.10.2009 19:07:36
Означает ли это, что мы можем фильтровать, используя связанный набор? Это было то, что я искал и не знал о его существовании. Есть ли в документации ORM что-нибудь, что упоминает об этом?
shanyu 14.10.2009 14:50:10
Да, конечно. Смотрите здесь: docs.djangoproject.com/en/dev/topics/db/queries/…
Daniel Roseman 14.10.2009 15:08:10