2

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

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

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

用户通常将文件显示为path + '/' + namefe '/bin' + '/' + 'bash' => '/bin/bash'。我不想提供搜索字段来查找文件。

如果我使用 Q()-Objects,我可以在路径或名称中搜索匹配项,但如果用户搜索'/bin/bash'.

到目前为止,我想出了:

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

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

.filter(fullpath__icontains=query)

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

如果可能的话,我想留在 django OR-Mapper 上,而不是在数据库上执行原始 SQL。

感谢所有建议

4

1 回答 1

2

您可以额外使用 DB 函数concat,因为在我的情况下我已经这样做了 concat date 。

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

希望这会帮助你。

谢谢。

于 2013-11-21T14:20:27.450 回答