gpt4 book ai didi

python - 搜索 Django 数据库,包括 ManyToManyField

转载 作者:太空宇宙 更新时间:2023-11-03 21:01:01 25 4
gpt4 key购买 nike

我是 Django 新手,但已经阅读了 select_lated 和 prefetch_lated。但是,我无法构建一个可以同时涵盖 OneToMany 关系和 ManyToMany 关系的搜索功能。

我的模型:

class Tag(models.Model):
tag = models.CharField(max_length=50, blank=False, unique=True)

def __str__(self):
return self.tag


class Course(models.Model):
title = models.CharField(max_length=10)
description = models.CharField(max_length=200, blank=True, null=True)
startdate = models.DateTimeField()
stopdate = models.DateTimeField()
teacher = models.ForeignKey(
Teacher, blank=True, null=True, on_delete=models.PROTECT
)

tags = models.ManyToManyField(Tag, blank=True)
classroom = JSONField(default=json.loads("{}"), blank=True, null=True)

def __str__(self):
return "[ {0} ] {1}-{2}".format(self.id, self.title, self.description)

def startdate_custom(self):
return self.startdate.strftime("%Y-%m-%d")

在我看来,我有一个类,我希望能够查询(使用搜索功能)数据库中的所有列/表(标题、描述、教师、标签、教室)。以下示例经过简化:

我可以在主表上构建查询:

search = 'Api'
qs = self.model.objects.select_related('teacher').prefetch_related('tags')
qs = qs.filter(description__icontains=search)

这种方法适用于标题、描述、教师...但不适用于我的 ManyToManyField

我可以,但是我无法将该过滤器扩展到标签

search = 'Api'
qs = self.model.objects.select_related('teacher').prefetch_related('tags')
qs = qs.filter(tag__icontains=search) <-- does not work

但是,我似乎可以通过迭代标签来过滤掉标签:

tags_qs = self.model.objects.all().prefetch_related('tags')
tags_list = [list(course.tags.filter(tag__icontains='API')) for course in tags_qs]

但这似乎会产生一个标签列表,而我需要在标题、描述、教师或标签中找到搜索词的所有类(class)的集合。

我是否需要对模型进行 2 个单独的查询并以某种方式连接它们(如何?),或者我是否缺少有关如何查询多对多关系的信息?

最佳答案

您需要告诉 Django 如何到达包含您要搜索的内容的字段。在本例中,源字段为 tags,目标模型上的字段称为 tag,并且使用双下划线语法进行连接。所以:

qs = qs.filter(tags__tag__icontains=search)

关于python - 搜索 Django 数据库,包括 ManyToManyField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55704035/

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