Django过滤器从两个表中添加结果

问题描述 投票:1回答:2

我试图通过过滤器从两个表中获取结果。我想获得所有的属性,如果有协议,我也想包括租客的名字和姓氏。下面是一个简单的模型。

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调用。

python django
2个回答
0
投票

由于您已经更改了问题,请使用以下查询,如果数据可用,那么只有它才能获取结果,急切加载。此外,如果你只调用all()然后它也被优化,因为它是Lazy Load并由Django推荐。

properties = Property.objects.all().prefetch_related('property')

在您的情况下,另一个选项是,使用LEFT OUTER JOIN的RAW Query将更加足以管理性能。


0
投票

在“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 %}
© www.soinside.com 2019 - 2024. All rights reserved.