user2616836
user2616836

Reputation:

Django queryset annotate using parent's field

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

Answers (1)

A. K. Tolentino
A. K. Tolentino

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

Related Questions