【发布时间】:2013-12-03 09:22:06
【问题描述】:
我正在开发一个用 Django 编写的应用程序,但在使用 select_related 和 prefetch_related 执行正确请求时遇到了一些问题
我有三个模型:
class Intervention(BaseModel):
date = DateField()
housing = ForeignKey('contract.Housing', related_name='interventions')
class Housing(BaseModel):
address = CharField(max_length=CHAR_FIELD_LENGTH)
class Tenant(BaseModel):
name = CharField(max_length=CHAR_FIELD_LENGTH)
phone = CharField(max_length=CHAR_FIELD_LENGTH, blank=True, null=True)
housing = ForeignKey(Housing, related_name='tenants')
我正在请求模型干预,如果我想访问住房信息,我只需要使用 select_related :
Interventions.object.select_related("housing").filter(...)
但我不知道如何使用 prefetch_related 访问租户:
Interventions.object.select_related("housing").prefetch_related("housing__tenants")
似乎不起作用,因为每次我尝试访问租户列表时都会进行查询。 有没有办法访问租户列表,最好是对 I 进行过滤(比如找到的第一个没有名字的租户)。
感谢您的回答。
阿尔杰洛斯
*编辑:这是一些代码:*
我要求就像我说的那样:
interventionPreventivesVisits = InterventionPreventiveVisit.objects.select_related("housing").prefetch_related("housing__tenants").filter(date__range=(self.weekDays[0], self.weekDays[len(self.weekDays)-1]))
self.weekDays 是一个天数表,用于在日历中显示干预。
然后,我想显示没有名字的租户:
在我的模板中,我循环遍历干预:
{%for inter in interventions %}
{%if day == inter.date %}
{{ inter | get_schedule_html_formated | safe}}
{%endif%}
{% endfor %}
我有一个模板标签来显示 HTML:
def get_schedule_html_formated(intervention):
housingTenant = None
for tenant in intervention.housing.tenants.all(): # Here it does a query
if tenant.name is not None:
housingTenant = tenant
....
然后我编写并返回我的 html
我正在寻找一种无需进行新查询即可设置 HousingTenant 的方法。
这样更好吗:)?
【问题讨论】:
标签: python django django-queryset