gpt4 book ai didi

python - 如何在ManyToManyField中搜索

转载 作者:行者123 更新时间:2023-12-01 04:18:26 25 4
gpt4 key购买 nike

我是 django 新手,我正在尝试在多对多字段中进行查询。我的查询示例:

在我拥有的模型中

class Line(models.Model):
name = models.CharField("Name of line", max_length=50, blank=True)


class Cross(models.Model):
lines = models.ManyToManyField(Line, verbose_name="Lines crossed")
date = models.DateField('Cross Date', null=True, blank=False)

我正在进行搜索,查询所有具有特定线条的十字架。我的意思是搜索框中的查询将如下所示:line_1、line_2、line_3结果将是具有所有线 (line_1, line2, line_3) 的所有十字

不知道过滤条件应该怎样!

    all_crosses = Cross.objects.all().filter(???)

查看代码:

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

非常感谢

最佳答案

你应该能够做到:

crosses = Cross.objects.filter(lines__name__in=['line_1', 'line_2', 'line_3'])

对于三个值中的任何一个。如果您要查找所有匹配的值,则需要使用 Q 对象:

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')

如果您需要动态构造 Q 对象,并假设“name”值就是您要发布的值:

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 对象、所包含对象数量的计数注释...没有按预期工作。

最后,我最终将 cross.lines 作为列表与发布的值列表进行匹配。

简而言之,我创建的搜索 View 以这种方式匹配:

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 模型上添加一列,以保留相关 lines 值的主键的逗号分隔列表,这您可以通过 post_save 信号保持同步。

使用附加字段,您可以直接查询“行”值而无需连接。

关于python - 如何在ManyToManyField中搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34026793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com