如何在查询中使用属性方法作为字段?

时间:2015-08-07 13:43:59

标签: python django

我有一个模特:

class Distributor(models.Model):

    ...

    @property
    def full_name(self):
        return self.name + self.surname

class UserProfile(AbstractUser):

    links = models.ManyToManyField(
        Link, blank=True, related_name='links_by_user')
    distributors = models.ManyToManyField(
        Distributor, blank=True, related_name='distributors_of_user')

现在我想做一个这样的查询:

dist_list=request.user.distributors.all().filter(full_name__icontains='')

但这不起作用。

如何进行此类查询?

2 个答案:

答案 0 :(得分:3)

Django过滤器在数据库级别运行。所以你想要的不可能。

请记住,如果您愿意,可以随时回退到SQL。当它是一个简单的SQL查询时,无需花费大量时间来弄清楚如何使Django ORM执行此操作:

query = """
    SELECT *
    FROM distributor_distributor d
        INNER JOIN user_user_profile up ON up.id = %(user_id)s
        INNER JOIN user_user_distributors_of_user udu ON udu.user_profile_id = %(user_id)s 
            AND udu.distributor_id = d.id
    WHERE d.name || d.surname = %(query)s;
"""

dist_list = Distributor.objects.raw(query, {'user_id': request.user.pk, 'query': 'hello world'})

在函数中包装它,将其放在utils.py模块或其他内容中,baby you've got a stew going!

答案 1 :(得分:2)

你想做什么是不可能的。如果你想这样做,你必须在python中进行过滤(类似于列表推导),如下所示:

replace(replace('SELECT count(*) INTO checkExists FROM `<dbname>`.`<tname>` WHERE id = 1',
                '<tname>', v_tablename
               ), '<dbname>', v_databasename
       )

这样做几乎肯定比查询数据库慢,但是,如果v_fullpath有很多条目。

但是,在这种特定情况下,您可以将要查询的字符串拆分为名字和姓氏,并分别查询每个字符串?也许是这样的:

checkExists