首页 > 解决方案 > 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

我认为最好将平台作为一个属性,但是这种方式会在没有外部脚本的情况下消除它的自动添加部分。

通过属性方法过滤对象(在本例中为“流”对象)的最有效方法是什么?还是以不同的方式做到这一点更好?

标签: pythondjangosqlitedjango-models

解决方案


您无法按方法过滤,因为您无法将其转换为 SQL。也就是说,在您给出的特定示例中,您可以链接过滤器语句。

这就是它的样子:Stream.objects.filter(host__platform__name='value')

有关其工作原理的更多信息:https ://books.agiliq.com/projects/django-orm-cookbook/en/latest/join.html


推荐阅读