Django过滤器添加两个表

时间:2018-03-21 06:52:39

标签: python django

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

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

2 个答案:

答案 0 :(得分:0)

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

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

你的另一个选择是,RAW Query with LEFT OUTER JOIN,将足以管理性能。

答案 1 :(得分: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 %}