【问题标题】:Filter query with variable list in django在 django 中使用变量列表过滤查询
【发布时间】:2016-04-03 12:42:03
【问题描述】:

我有一个这样的三表模型:

我想用变量列表过滤查询结果,例如:

listTags = ["landscape","green"]
results = ListTag.objects.filter(tag__name__in=listTags).select_related()

但是该查询的结果是所有具有 landscape OR green 的 ListTag 对象,但我想要的是 ListTag 对象的列表风景 AND 绿色

我看到了很多关于这个问题的答案,但其中很多都使用静态标签列表,我希望它使用变量 listtags 列表进行过滤

编辑:模型

class Picture(models.Model):
    title = models.CharField(max_length=50,null=True, blank=False, verbose_name=('name'))

    def __str__(self):
        return self.titre

class Tag(models.Model):
    name = models.CharField(max_length=50,null=True, blank=False, verbose_name=('name'))

    def __str__(self):
        return self.name

class ListTags(models.Model):
    picture = models.ForeignKey(Picture, blank=False, on_delete=models.CASCADE, related_name='picture')
    tag = models.ForeignKey(Tag, blank=False, on_delete=models.CASCADE, related_name='tag')

【问题讨论】:

  • 看你的图不清楚模型之间是什么关系,你能给出简化的模型代码吗?

标签: sql django django-models django-views django-rest-framework


【解决方案1】:

您可以尝试使用Django Q object

在你的情况下,这可能是:

从 django.db.models 导入 Q ... listTags = [“风景”,“绿色”] 查询 = Q() 对于 listTags 中的标签: 查询 &= Q(tag__name = tag) 结果 = ListTag.objects.filter(query).select_related()

加法
如果你只想要带有标签的图片,那么你可以使用many-to-many relationships。但是如果你想为不同类型的模型使用标签,那么你需要使用generic relations

在第一种情况下,模型结构可以是:

从 django.db 导入模型 类标签(模型。模型): name = models.CharField(max_length=50, null=True, blank=False, verbose_name=('name')) def __str__(self): 返回 self.name 类图片(模型。模型): title = models.CharField(max_length=50, null=True, blank=False, verbose_name=('name')) 标签 = models.ManyToManyField(标签) def __str__(self): 返回self.title

使用 m2m 关系 Q 对象将不起作用,因此要获取所有带有横向和绿色标签的图片,您可以使用过滤器链接:

listTags = [“风景”,“绿色”] 结果 = models.Picture.objects.all() 对于 listTags 中的标签: 结果 = results.filter(tags__name = tag)

【讨论】:

  • 它按实际情况工作,它获取与 Tag 名称相关的 ListTag 对象 landscape AND green 。但是用这种模型结构是不可能获得具有 landscape AND green 的 ListTag 对象,它总是只有一个 Tag object landscape OR greenTagList 相关。这就是为什么此代码的结果为空的原因。我认为您需要重新构建模型并明确目标
  • 你能给我一个改变我的模型的方法吗?我的目标是获取带有用户可以输入的标签的图片
【解决方案2】:

我相信下面的代码会使其成为 AND 查询而不是 OR 查询:

listTags = ["landscape","green"]

filters = {}
for value in listTags:
    filters['tag__name__in'] = value

results = ListTag.objects.filter(**filters)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 2011-06-10
    • 2020-11-11
    • 2020-05-23
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多