繁体   English   中英

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

[英]Django query Select X from Table where Y = Z

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

我有两个表:

表A:

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

表B:

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

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

例:

表A:

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

表B:

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

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

总之,我需要一个Django代码来执行查询:

a_name = 'John'

SELECT code FROM Table_A WHERE name = a_name

考虑到我只知道表B的值,因此无法通过表A的name获得code的值。

假设您的表名称分别为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 

假设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

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

另一种方法是使用Django的valuesvalues_list方法。 您提供想要数据的字段名称。

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)
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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM