python - Django:如何有效地过滤模型属性方法?
问题描述
我一直在寻找一种使用YourModel.objects.filter()
具有属性值的方法来有效过滤 Django 模型对象的方法。
Django 无法以这种方式过滤属性方法。
列表理解仍然可以:
streams = [object for object in YourModel.objects.all() if object.property_method == 'value']
有人告诉我,这种方法效率不高,因为您仍然遍历 SQL 表中的每个对象,而不是显然更有效的 SQL 过滤方式。
真的,我想知道最好的方法是什么。
这是我的示例模型:
# someapp/models.py
from django.db import models
class Platform(models.Model):
name = models.CharField(max_length=50, null=True)
def __str__(self):
return self.name
class Account(models.Model):
platform = models.ForeignKey(Platform, on_delete=models.PROTECT)
name = models.CharField(verbose_name="Account Name", max_length=100, null=True)
profile_pic = models.ImageField(upload_to='profile_pictures', null=True, blank=True)
def __str__(self):
return self.name
class Stream(models.Model):
host = models.ForeignKey(Account, on_delete=models.CASCADE, verbose_name="Host")
def __str__(self):
return self.host.name
@property
def platform(self):
return self.host.platform
我认为最好将平台作为一个属性,但是这种方式会在没有外部脚本的情况下消除它的自动添加部分。
通过属性方法过滤对象(在本例中为“流”对象)的最有效方法是什么?还是以不同的方式做到这一点更好?
解决方案
您无法按方法过滤,因为您无法将其转换为 SQL。也就是说,在您给出的特定示例中,您可以链接过滤器语句。
这就是它的样子:Stream.objects.filter(host__platform__name='value')
有关其工作原理的更多信息:https ://books.agiliq.com/projects/django-orm-cookbook/en/latest/join.html
推荐阅读
- javascript - 如何从 JSON 响应解码客户端的 Base64 文件?
- api - 获取 github API 结果超过 100
- video - 使用 webdriverio 浏览器对象如何检查视频是否正在播放
- javascript - TypeError:无法读取未定义的 reactjs url 的属性“用户名”
- c# - 更改链接到单个函数 C# 的按钮的前景色
- javascript - react中的子组件阻止父组件导入redux store
- sql - Informatica Powercenter 中的源限定符 SQL 查询
- python - 获取关于距离的亮度级别(python)
- javascript - 基于 Dropdown 的 React Effector 状态管理
- ios - “ld:找不到-lreact-native-webrtc的库”在ios xcode中归档产品但在模拟器上工作正常