我试图通过过滤器从两个表中获取结果。我想获得所有的属性,如果有协议,我也想包括租客的名字和姓氏。下面是一个简单的模型。
class Property(models.Model):
name = models.CharField(max_length=70, blank=True, verbose_name="Property Name")
class Agreement(models.Model):
property = models.ForeignKey(Property, on_delete=models.CASCADE, related_name="prop")
firstname = models.CharField(max_length=40, verbose_name="First Name")
lastname = models.CharField(max_length=40, verbose_name="Last Name")
通常我会得到所有的属性
properties = Properties.objects.all()
有下面的方法:
properties = Properties.objects.all() \
.somemethod(get values of firstname and lastname from aggreement if related record exists.)
我可以循环处理属性结果并从协议中获取值。但我认为这不是首选方式,因为它会进行许多SQL调用。
由于您已经更改了问题,请使用以下查询,如果数据可用,那么只有它才能获取结果,急切加载。此外,如果你只调用all()
然后它也被优化,因为它是Lazy Load并由Django推荐。
properties = Property.objects.all().prefetch_related('property')
在您的情况下,另一个选项是,使用LEFT OUTER JOIN的RAW Query将更加足以管理性能。
在“Anup Yadav”的答案帮助下进行了一些搜索。我找到了做到这一点的方法。为了便于理解,我还在属性的协议模型中为属性字段添加了related_field定义。
所以这是做到这一点的方法。
properties = Properties.objects.all() \
.values('name','prop__firstname','prop__lastname)
现在我可以在html模板中使用它,如下所示:
{% for pp in properties %}
Property Name: {{ pp.name }}<br>
First Name: {{ pp.prop__first_name }}<br>
Last Name: {{ pp.prop__first_name }}<br>
{% endfor %}