我有一个模型:
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!
