我有一个模特:
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='')
但这不起作用。
如何进行此类查询?
答案 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