python - 如何将 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
.
解决方案
您可以使用以下方式过滤:
Network.objects.filter(members__user=self.user)
可以使用双下划线 ( __
) 来“透视”关系。由于您指定了related_name='members'
,我们反向访问该关系。
如果有多个NetworkMember
s 具有相同的用户到相同的 s Network
,那么Network
将返回很多次,因为有这样NetworkMember
的 s ,您可以使用.distinct()
[Django-doc]来防止:
Network.objects.filter(members__user=self.user).distinct()
推荐阅读
- android - 读取制造商数据 BLE 设备 react-native-ble-plx
- gulp - Gulp-bower 抛出错误“当 ws.length != 0 时调用转换完成”
- javascript - 在不更新 DevTools 控制台的情况下刷新页面
- python - 在 Numpy 中拆分多维数组
- python - django.setup() 给我 ModuleNotFoundError: when running in pycharm
- user-interface - 调整列宽文本字段 Ui 上的 Extjs 被破坏
- laravel - 在laravel中计算错误的数量
- dataset - 如何将 excel 附加到现有数据集而不丢失 Foundry 中的其他列?
- json - jsonschemavalidator.net 无法匹配 dateTime 模式
- azure - 错误(未找到 Azure DevOps Services 或 Team Foundation Server 存储库配置。确保)共享项目时