Skip to main content
 首页 » 编程设计

python之如何将属性方法用作查询中的字段

2025年05月04日38qq号

我有一个模型:

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='') 

但这行不通。

如何进行这样的查询?

请您参考如下方法:

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!