【问题标题】:Django: Select object contains all keywordsDjango:选择对象包含所有关键字
【发布时间】:2018-10-19 15:04:51
【问题描述】:

这是数据库的样子:

id | Post    |  tag
 1 | Post(1) |  'a'
 2 | Post(1) |  'b'
 3 | Post(2) |  'a'
 4 | Post(3) |  'b'

这是模块的代码

class PostMention(models.Model):
    tag = models.CharField(max_length=200)
    post = models.ForeignKey(Post,on_delete=models.CASCADE)

这是搜索的代码,

def findPostTag(tag):
    keywords=tag.split(' ')
    keyQs = [Q(tag=x) for x in keywords]
    keyQ = keyQs.pop()
    for i in keyQs:
        keyQ &= i
    a = PostMention.objects.filter(keyQ).order_by('-id')
    if not a:
        a=[]
    return a

(此代码无法正常工作)

我撤回标签并将每个标签保存为数据库中的一行。现在我想做一个搜索功能,用户可以同时输入多个关键字,比如'a b',它会返回'Post(1)'。我搜索了一些类似的情况,但似乎都是关于同时在一行中搜索多个关键字,比如使用Q(tag='a') & Q(tag='b'),它会搜索同时等于'a'和'b'(在我看来),这不是我想要的(显然没有结果)。那么有什么办法可以解决这个问题吗?谢谢。

【问题讨论】:

  • 不确定你的意思。如果您发布实际代码,通常会更好地理解。就像你的 Django 模型的相关部分,也许你到目前为止已经尝试过的查询。

标签: python sql django


【解决方案1】:

在这种情况下,django 提供ManyToManyField,您必须使用才能正常工作:

class Tags(models.Model):
    tag = models.CharField(unique=True, verbose_name='Tags')

class Post(models.Model): #your model
    title = models.CharField(verbosone_name = 'Title')
    post_tags = models.ManyToManyField(Tags, verbose_name='Choice your tags')

所以你会为你的帖子选择很多标签

【讨论】:

  • 我起床后会继续尝试......今天太困了,但是谢谢,我认为它会非常有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2022-11-23
相关资源
最近更新 更多