Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django查询从Y=Z的表中选择X_Python_Sql_Django - Fatal编程技术网

Python Django查询从Y=Z的表中选择X

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

对我来说,很难清楚地理解Django提出问题的方式

我有两张桌子:

表A:

+----+-----+----+
| 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中匹配的每个人的代码。我去掉了他知道他要查找的数据的假设。他可以根据自己的需要修改查询。这确实回答了这样一个问题:当我需要在不同的字段上进行匹配时,如何从一个表中获取字段。这个问题很基本,但非常详细!