在连接的额外字段上过滤django queryset

时间:2013-06-05 10:21:38

标签: django django-queryset

我有以下(缩短的)Django模型:

class File(models.Model):
    name = models.TextField()
    directory = models.ForeignKey(Directory)

class Directory(models.Model):
    path = models.TextField()

用户通常将文件显示为path + '/' + name,f.e。 '/bin' + '/' + 'bash' => '/bin/bash'。我不是想提供一个搜索字段来查找文件。

如果我使用Q() - 对象我可以在路径或名称中搜索匹配项,但如果用户搜索'/bin/bash'则会失败。

到目前为止,我已经提出:

files = File.objects.extra(select={'fullpath': 'path || "/" || name'},
    tables=['directories'], order_by= ['fullpath']).distinct()

不幸的是,这确实首先将所有目录与所有文件名连接起来,而不仅仅是实际存在的目录。此外,我无法添加另一个过滤器

.filter(fullpath__icontains=query)

因为我无法引用额外字段。

如果可能的话,我想继续使用django OR-Mapper而不是在db上执行原始SQL。

感谢所有建议

1 个答案:

答案 0 :(得分:2)

您可以在额外使用数据库功能 concat ,因为我这样做是为了在我的情况下连接日期。

Event.objects.all().order_by('-start_time').extra(select={'date':'concat(year(start_time),\"/\",month(start_time),\"/\",day(start_time))','time':'concat(hour(start_time),\":\",minute(start_time))','program_no':'program_id'}).values('id','program_no','event_type__name','venue__city','venue__state','venue__website','series_id','date','time')

希望这会对你有所帮助。

感谢。