Reputation:
I'm trying to reference a field in annotate, like what an F()
object does.
# Getting users in this particular Group (using GroupMediator to also get "joined" date)
GroupMediator.objects.filter(group=group).annotate(
# GroupPosition is a user's title within a group, like "treasurer".
position=GroupPosition.objects.filter(group=group, recipients=F('member')))
Problem: F('member')
looks for a "member" field in GroupPosition
, but I want to get the "member" field from GroupMediator
.
I'm trying to get each member's position in the group in the same query I get all the members. I'm trying to be efficient so I don't have to use a for loop and query every single member to get their position.
I'd like to avoid using raw queries if possible. I'm stuck.
Models:
class Group(models.Model):
title = models.CharField(_("title"), max_length=60, blank=False)
members = models.ManyToManyField(User, related_name='member_of_groups', verbose_name=_("members"), blank=True, through='GroupMediator')
class GroupMediator(models.Model):
member = models.ForeignKey(User, related_name="group_mediators", verbose_name=_("member"), blank=False, editable=False)
group = models.ForeignKey(Group, related_name="group_mediators", verbose_name=_("group"), blank=False, editable=False)
joined = models.DateTimeField(_("created"), auto_now_add=True, editable=False)
class GroupPosition(models.Model):
# This is its own model so many different custom positions can be created for each group.
group = models.ForeignKey(Group, related_name="group_positions", verbose_name=_("group"), blank=False, editable=False)
recipients = models.ManyToManyField(User, related_name='received_group_positions', verbose_name=_("recipients"), blank=True)
title = models.CharField(_("title"), max_length=60, blank=False)
Thank you! I may be approaching this wrong, any and all advice appreciated.
Upvotes: 2
Views: 1463
Reputation: 2222
As of Django 1.11, you can use OuterRef()
.
Ref: https://docs.djangoproject.com/en/1.11/ref/models/expressions/#django.db.models.OuterRef
Upvotes: 1