我是django的新手,我正在尝试在多对多的字段中进行查询。 我的查询的一个例子:
在我拥有的模型中
all_crosses = Cross.objects.all().filter(???)
我正在搜索所有具有某些线条的十字架。 我的意思是搜索框中的查询将如下所示:line_1,line_2,line_3 结果将是包含所有行(line_1,line2,line_3)
的所有十字我不知道过滤条件应该如何!
def inventory(request):
if request.method == "POST":
if 'btn_search' in request.POST:
if 'search_by_lines' in request.POST:
lines_query = request.POST['search_by_lines']
queried_lines = split_query(lines_query, ',')
query = [Q(lines__name=l) for l in queried_lines]
print(query)
result = Cross.objects.filter(reduce(operator.and_, query))
观看代码:
{{1}}
非常感谢
答案 0 :(得分:2)
你应该可以这样做:
<?php
require_once 'dbconfig.php';
try {
$conn = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
$sql = 'SELECT * FROM estudiantes WHERE id = ' . $_GET['id'];
$q = $conn->query($sql);
$q->setFetchMode(PDO::FETCH_ASSOC);
// Get the one and only result
$student = $q[0];
} catch (PDOException $pe) {
die("Could not connect to the database $dbname :" . $pe->getMessage());
}
?>
<!DOCTYPE html>
<html>
<head>
<title>VIEW STUDENT DETAILS</title>
<link href="css/bootstrap.min.css" rel="stylesheet">
<link href="css/style.css" rel="stylesheet">
</head>
<body>
<div id="container">
<h1><?php echo $student['name'] ?> <?php echo $student['lastname'] ?></h1>
<p>First Name: <?php echo $student['name'] ?></p>
<p>Last Name: <?php echo $student['lastname'] ?></p>
</body>
</div>
</html>
表示三个值中的任何一个。如果您正在寻找匹配的所有值,那么您需要使用Q对象:
crosses = Cross.objects.filter(lines__name__in=['line_1', 'line_2', 'line_3'])
您可以使用至少一种其他方法,即链接过滤器:
from django.db.models import Q
crosses = Cross.objects.filter(
Q(lines__name='line_1') &
Q(lines__name='line_2') &
Q(lines__name='line_3')
)
如果你需要动态构造Cross.objects.filter(lines__name='line_1')
.filter(lines_name='line_2')
.filter(lines__name='line_3')
个对象,并假设&#34; name&#34;价值就是您发布的内容:
Q
原来,我错了。我尝试了几种不同的查询import operator
lines = [Q(line__name='{}'.format(line)) for line in request.POST.getlist('lines')]
crosses = Cross.objects.filter(reduce(operator.and_, lines))
对象的方法,其中Cross
的值与搜索到的所有项匹配。 lines
个对象,包含对象数量的计数注释......没有按预期工作。
最后,我最终将Q
作为列表与发布的值列表进行匹配。请参阅此sample project。
简而言之,我创建的搜索视图以这种方式匹配:
cross.lines
在这种情况下,我可能会做的是在results = []
posted_lines = []
search_by_lines = 'search_by_lines' in request.POST.keys()
crosses = Cross.objects.all().prefetch_related('lines')
if request.method == 'POST' and search_by_lines:
posted_lines = request.POST.getlist('line')
for cross in crosses:
if list(cross.lines.values_list('name', flat=True)) == posted_lines:
results.append(cross)
return render(request, 'search.html', {'lines': lines, 'results': results,
'posted_lines': posted_lines})
模型上添加一列,以保留相关Cross
值的主键的逗号分隔列表,您可以通过这些列保持同步一个post_save信号。
使用附加字段,您可以直接查询&#34; line&#34;没有连接的值。