2013-06-05 50 views
2

我有以下的(缩短)Django的模型:筛选的Django的queryset通过级联额外场

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

您可以使用DB函数CONCAT额外的,因为我已经在我的情况下做到了这一点,以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') 

希望这会对你有帮助。

谢谢。

+0

谢谢你的回答。这个问题被询问的项目现在已经完成并发货了;我不再有权访问代码或需要更改代码。如果我再次遇到这个问题,我会记住它。 – tannerli

相关问题