在连接的额外字段上筛选django queryset
我有以下(缩短的)Django型号:在连接的额外字段上筛选django queryset,django,django-queryset,Django,Django Queryset,我有以下(缩短的)Django型号: class File(models.Model): name = models.TextField() directory = models.ForeignKey(Directory) class Directory(models.Model): path = models.TextField() 用户通常会将文件显示为path+'/'+name,例如'/bin'+'/'+'bash'=>'/bin/bash'。我没有试图提供搜索
class File(models.Model):
name = models.TextField()
directory = models.ForeignKey(Directory)
class Directory(models.Model):
path = models.TextField()
用户通常会将文件显示为path+'/'+name
,例如'/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或Mapper,而不是在db上执行原始SQL
感谢所有建议您可以额外使用DB functionconcat,因为我已经在我的案例中对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')
希望这对你有帮助
谢谢。谢谢你的回答。提出这个问题的项目现在已经完成并交付;我不再有权访问代码或需要更改它。不过,如果我再次遇到这个问题,我会牢记在心。