Django查询从表中选择X,其中Y = Z

时间:2019-02-01 14:29:08

标签: python sql django

我仍然很难清楚地了解Django进行查询的方式。

我有两个表:

表A:

+----+-----+----+
| id |code |name|
+----+-----+----+

表B:

+----+----+
| id |name|
+----+----+

两个表的name的值可以相等(或不相等)。如果表B在任何行中均与表A匹配,我需要做的是通过比较两个表的code来获取表A列name的值。

示例:

表A:

+----+----+----+
| id |code|name|
+----+----+----+
| 4  | A1 |John|
+----+----+----+

表B:

+----+----+
| id |name|
+----+----+
| 96 |John|
+----+----+

因此,通过将John(B)与John(A)进行比较,我需要返回A1,因为它是同一行中的code结果匹配表A。

最后,我需要一个Django代码来进行查询:

a_name = 'John'

SELECT code FROM Table_A WHERE name = a_name

请注意,我只知道表B的值,因此无法通过表A的code来获得name的值。

4 个答案:

答案 0 :(得分:2)

假设表的名称分别为AB,那么:

try:
    obj = A.objects.get(name='John')
    if B.objects.filter(name='John').exists():
        print obj.code # found a match and now print code.      
except:
    pass 

答案 1 :(得分:1)

让我们假设TableATableB是Django模型。然后,您的查询可能如下所示:

a_name = 'John'

it_matches_on_b = ( Table_B
                   .objects
                   .filter(  name = a_name )
                   .exists()
                  )

fist_a = ( Table_A
            .objects
            .filter(  name = a_name )
            .first()
          )

your_code = fist_a.code if it_matches_on_b and fist_a != None else None

我不注释代码,因为它是不言自明的。但是,如果有的话,在评论中写问题。

答案 2 :(得分:1)

另一种方法是使用Django的valuesvalues_list方法。您提供要为其提供数据的 field 名称。

values = Table_A.objects.filter(name=B_name).values('code')

这将返回仅包含code值的字典。从django文档中,https://docs.djangoproject.com/en/2.1/ref/models/querysets/#django.db.models.query.QuerySet.values

或者您可以使用values_list将结果格式化为列表。

values = Table_A.objects.filter(name=B_name).values_list('code')

这将返回一个元组列表,即使您只请求一个字段。 django文档https://docs.djangoproject.com/en/2.1/ref/models/querysets/#django.db.models.query.QuerySet.values_list

要尝试使其更加健壮,请首先从Table_B获取命名值列表。提供flat=True会创建一个真实列表,因为values_list将为您提供元组列表。然后使用该列表对Table_A进行过滤。您可以仅返回代码或代码和名称。按照编写的方式,它为表A和表B中的每个匹配名称返回一个平面的用户代码列表。

b_names_list = Table_B.objects.values_list('name', flat=True)
values =Table_A.objects.filter(name__in=b_names_list).values_list('code', flat=True)

答案 3 :(得分:0)

B_name = ‘whatever’
Table_A.objects.filter(name = B_name)

如果您想基于Table_B的名称值来获取来自Table_A的名称值的db字段值,则以上是基本查询

要获取值:

obj = Table_A.objects.get(name = B_name)

print(obj.name)
print(obj.code) # if you want the 'code' field value