如何在ManyToManyField中搜索

时间:2015-12-01 17:49:54

标签: python django django-1.4

我是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}}

非常感谢

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;没有连接的值。