jafarlihi
jafarlihi

Reputation: 100

How to transform QuerySet to another type?

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.

Upvotes: 1

Views: 320

Answers (1)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 476659

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()

Upvotes: 1

Related Questions