Python Django查询从Y=Z的表中选择X
对我来说,很难清楚地理解Django提出问题的方式 我有两张桌子: 表A:Python Django查询从Y=Z的表中选择X,python,sql,django,Python,Sql,Django,对我来说,很难清楚地理解Django提出问题的方式 我有两张桌子: 表A: +----+-----+----+ | id |code |name| +----+-----+----+ +----+----+----+ | id |code|name| +----+----+----+ | 4 | A1 |John| +----+----+----+ 表B: +----+----+ | id |name| +----+----+ +----+----+ | id |name| +----+
+----+-----+----+
| id |code |name|
+----+-----+----+
+----+----+----+
| id |code|name|
+----+----+----+
| 4 | A1 |John|
+----+----+----+
表B:
+----+----+
| id |name|
+----+----+
+----+----+
| id |name|
+----+----+
| 96 |John|
+----+----+
两个表的name
值可以相等(或不相等)。我需要做的是,如果表B在任何一行中与表A匹配,则通过比较两个表的name
来获得表A列code
的值
例如:
表A:
+----+-----+----+
| id |code |name|
+----+-----+----+
+----+----+----+
| id |code|name|
+----+----+----+
| 4 | A1 |John|
+----+----+----+
表B:
+----+----+
| id |name|
+----+----+
+----+----+
| 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
的值
B_name = ‘whatever’
Table_A.objects.filter(name = B_name)
如果您想从表_A获取连接到名称值的db fields值,则基于您知道表_B的名称值这一事实,以上是基本查询
要获取值,请执行以下操作:
obj = Table_A.objects.get(name = B_name)
print(obj.name)
print(obj.code) # if you want the 'code' field value
让我们假设
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
我不注释代码,因为它是自解释的。但如果有,请在注释上写问题。假设表名分别为
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
另一种方法是使用Django的
values
和values\u list
方法。您可以提供需要数据的字段名
values = Table_A.objects.filter(name=B_name).values('code')
这将返回一个只包含code
值的字典。从django文档中
或者,您可以使用values\u list
将结果格式化为列表
values = Table_A.objects.filter(name=B_name).values_list('code')
这将返回元组列表,即使您只请求一个字段。django文件
为了使这一点更加可靠,首先从表B中获取命名值列表。提供flat=True
将创建一个True列表,因为值列表将为您提供一个元组列表。然后使用列表筛选表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)
谢谢你@Zollie,我已经知道那个密码了。但是现在,如何获得表A的列“code”值?与您的代码返回的行相同course@GonzaloD“ambra这两张表的比较结果如何?它只是给出了A.@Ahtisham中
code
的结果-我认为他的问题的目的只是知道如何根据已知值从表中获取特定值。它可以变得像任何人想要的那样复杂,但基本上,问这个问题的人只想学习从表中获取特定值。。。所以,别介意…@Zollie他是这么说的:“如果表B在任何一行中与表A匹配,我需要做的是通过比较两个表的名称来获取表A列代码的值。”@Ahtisham-海报最可能想问smply“根据另一个值过滤并从另一个表中获取值”,相反,他写了“比较两个值”等等,你看。。。有时这些事情只是发生了,可能会被误解。英语不是这里很多人的第一语言。@GonzaloD'ambra它是怎么工作的?这个答案的作者只是从表A中获取代码的值,如果它有一个名称John
,但您在问题中说,您想比较两个表的值John
,如果在两个表中都找到了值,那么您想在表A中获取代码。查询集是迭代构建的。django文档在这里有很好的描述,。关于过滤查询集唯一性的部分有一个不错的小例子。您可以根据需要将任意多个过滤器/查询集生成方法链接在一起,以获得所需的对象。这是迄今为止最好的答案。我想它可以为我工作。非常感谢。现在我只需要知道如何从查询字典中获取干净的数据,为了使用“code”@Ahtisham的值答案是正确的,它返回的是“code”@Ahtisham的值当我假设他知道他要找的名字时,你非常担心答案不符合问题。这个答案将找到表A和表B中匹配的每个人的代码。我去掉了他知道他要查找的数据的假设。他可以根据自己的需要修改查询。这确实回答了这样一个问题:当我需要在不同的字段上进行匹配时,如何从一个表中获取字段。这个问题很基本,但非常详细!