Django过滤器基于连接表

时间:2017-09-26 17:05:38

标签: django django-models

我有两张桌子:

class Client(models.Model):
    name = models.TextField()
    lastname = models.TextField()

    class Meta:
        managed = False
        db_table = 'client'

class Clientreport(models.Model):
        id_client_home = models.ForeignKey('Client', models.DO_NOTHING, db_column='id_client_home', related_name='home_id_client_home')
        id_client_reported = models.ForeignKey('Client', models.DO_NOTHING, db_column='id_client_reported', related_name='client_id_client_home')

        class Meta:
            managed = False
            db_table = 'clientreport'

我正在尝试构建类似于此的查询:

SELECT cr.*, cl.id, cl.name, cl.lastname FROM Clientreport cr INNER JOIN Client cl ON cr.id_client_reported = cl.id 
WHERE (LOWER(cl.name) LIKE LOWER('%jo%') OR LOWER(cl.lastname) LIKE LOWER('%jo%') ) 

我尝试过使用: SQL queries

但是,现在我正在尝试使用django。 如何使用django ???

访问已连接的模型

1 个答案:

答案 0 :(得分:3)

您可以使用标准的Django Queryset过滤器跨联接查询,使用__来查看这样的关系:

Clientreport.objects.filter(client_id_client_home__name='jo')

client_id_client_home是您related_name模型中的Clientreport。有关queries using related objects的文档中的更多信息。

要重现LIKE LOWER('%jo%'),您可以使用__icontains

Clientreport.objects.filter(client_id_client_home__name__icontains='jo')