首页 > 解决方案 > 如何将 QuerySet 转换为另一种类型?

问题描述

假设你有这些模型:

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)

你已经过滤了NetworkMember

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

现在user_networks是 QuerySet 的NetworkMember,我怎样才能将它转换为 QuerySet 的Network

执行.values('network')并且.values_list('network')不会将 QuerySet 的类型更改为Network.

标签: pythondjangodjango-queryset

解决方案


您可以使用以下方式过滤:

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

可以使用双下划线 ( __) 来“透视”关系。由于您指定了related_name='members',我们反向访问该关系。

如果有多个NetworkMembers 具有相同的用户到相同的 s Network,那么Network将返回很多次,因为有这样NetworkMember的 s ,您可以使用.distinct()[Django-doc]来防止:

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

推荐阅读