Search code examples
djangodjango-modelsdjango-orm

How to make a query on related_name field?


I have to models connected by a ForeignKey

class User(AbstractUser):
   ...

and

class PrivateMessage(models.Model):
    user_from = models.ForeignKey(
        User,
        verbose_name=u'From',
        related_name='sent_messages',
    )
    user_to = models.ForeignKey(
        User,
        verbose_name=u'To',
        related_name='received_messages',
    )

Is there any way to get all the addresses for a particular user. For example, if

u = User.objects.get(id=1)
messages = PrivateMessage.objects.filter(user_from=u)
for m in messages:
    users.add(m.user_to)

How to obtain a list of users that appear in user_to for these messages using only Django ORM methods?


Solution

  • Finally, I ended up writing three queries:

        users_from = set(PrivateMessage.objects.filter(
            user_to=self.request.user,
        ).values_list(
            'user_from__pk',
            flat=True,
        ))
        users_to = set(PrivateMessage.objects.filter(
            user_from=self.request.user,
        ).values_list(
            'user_to__pk',
            flat=True,
        ))
        interlocutors = User.objects.filter(pk__in=users_from.union(users_to))