[英]data structure that can do a “select distinct X where W=w and Y=y and Z=z and …” type lookup
[英]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
的值。
假设您的表名称分别为A
和B
则:
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
假设TableA
和TableB
是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的values
和values_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.