【发布时间】:2018-01-26 12:13:54
【问题描述】:
假设我有一个非常基本的用户模型,包含姓名和年龄:
class User(models.Model):
name = CharField() # e.g. John Smith
age = IntegerField() # e.g. 21
我想过滤 18 岁以上的用户,并为每个用户添加一个特殊属性 namesakes(例如,对于 "John Smith",它类似于 ["John Williams", "John for Neumann", ...])。
我知道,如何在 N+1 个请求中做到这一点:
for user in User.objects.filter(age__gt=18):
user.namesakes = User.objects.filter(name__startswith=user.name.split()).\
all()
但是我如何在一个请求中做到这一点?理想情况下,对于查询集中的每个User 对象,我想创建一个包含同名查询集的自定义属性namesakes。这与 annotate() 或 prefetch_related() with to_attr 所做的非常相似,但不完全一样。
如果可能,我也希望避免使用原始 SQL。
谢谢。
【问题讨论】:
-
我能看到的最接近的是this answer about doing your own F expressions。如果你可以将它与一个 SQL 函数结合起来来分割字符串,比如Postgres
substring(string from pattern)orsplit_part,也许你可以做到。它可能是特定于数据库的,您似乎想避免这种情况(没有原始 SQL),但我还没有在 Django 中看到用于拆分字符串的函数。 -
@PauloAlmeida 谢谢你,保罗,我想这正是我所需要的。