我仍然很难清楚地了解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
的值。
答案 0 :(得分:2)
假设表的名称分别为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
答案 1 :(得分:1)
让我们假设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
我不注释代码,因为它是不言自明的。但是,如果有的话,在评论中写问题。
答案 2 :(得分:1)
另一种方法是使用Django的values
和values_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