【发布时间】:2020-10-25 16:06:38
【问题描述】:
我一直在寻找一种使用带有属性值的 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
我认为最好将平台设置为属性,但这种方式会在没有外部脚本的情况下消除它的自动添加部分。
通过属性方法过滤对象(在本例中为“流”对象)的最有效方法是什么?还是换一种方式更好?
【问题讨论】:
标签: python django sqlite django-models