How to transform QuerySet to another type?

Viewed 68

Say you've got these models:

class NetworkMember(models.Model):
    network = models.ForeignKey(Network, related_name='members', on_delete=models.CASCADE, db_column='network_id_id')
    user = models.ForeignKey(User, on_delete=models.CASCADE, db_column='user_id_id')

class Network(models.Model):
    created_at = models.DateTimeField(auto_now_add=True, db_index=True)

And you have filtered NetworkMember:

    user_networks = NetworkMember.objects.filter(user=self.user)

Now user_networks is QuerySet of NetworkMember, how can I transform it to QuerySet of Network?

Doing .values('network') and .values_list('network') doesn't change the type of QuerySet to Network.

1 Answers

You can filter with:

Network.objects.filter(members__user=self.user)

One can use double underscores (__) to look "through" relations. Since you specified the related_name='members', we access the relation in reverse.

If there are multiple NetworkMembers with the same user to the same Network, then that Network will be returned that many times as there are such NetworkMember's, you can use .distinct() [Django-doc] to prevent that:

Network.objects.filter(members__user=self.user).distinct()
Related