我正在尝试执行此简单查询,但它不起作用。感谢。
SELECT * FROM TSimple where (start_date < '2012-04-20' and end_date is null) or
(end_date > '2012-04-20' and start_date < '2012-04-20')
class TSimple (models.Model):
start_date = models.DateTimeField()
end_date = models.DateTimeField(blank=True, null=True)
...
class TSimpleResource(ModelResource):
def dehydrate(self, bundle):
request_method = bundle.request.META['REQUEST_METHOD']
if request_method=='GET':
new_date = bundle.request.GET.get('new_date', '')
qs = TSimple.objects.raw(
'SELECT * FROM TSimple where (start_date<=\'' +
new_date + '\' and end_date>=\'' +
new_date + '\') or (start_date<=\'' + new_date +
'\' and end_date is null)')
ret_list = [row for row in qs]
// NOT WORK. Not able to get correct json data in javascript.
// It needs return bundle. HOW to replace bundle?
// Is this correct way to do it?
return ret_list
else:
// This is ok.
return bundle
我有以下问题:
1)(原始sql方法)如果在脱水方法中实现是否正确的方法呢?如果是,上面不起作用。它应该返回bundle对象。如何构建新的捆绑包?如果上面的方法没问题,我注意到bundle已经使用默认查询(?)构造了.data字段,这将被新查询丢弃。如果这是正确的方法,这就提出了问题。
2)如果还有其他原始的sql方法呢?在哪里执行sql?
3)如何在过滤器中执行此操作?
4)我知道sql并不熟悉复杂的过滤器。这就是我尝试使用原始sql方法进行快速原型的原因。什么是退缩?我注意到使用Tastypie有许多不必要的查询,我不知道如何摆脱它。例如,在表上查询外键触发查询另一个表的数据,我不想得到。
答案 0 :(得分:0)
我找出过滤器,看起来很有效。但我仍然对raw sql感兴趣。
def apply_filters(self, request, applicable_filters):
base_filter = super(TSimpleResource, self).apply_filters(request,
applicable_filters)
new_date = request.GET.get('new_date', None)
if new_date:
qset = (
(
Q(start_date__lte=new_date) &
Q(end_date__gte=new_date)
) |
(
Q(start_date__lte=new_date) &
Q(end_date__isnull=True)
)
)
base_filter = base_filter.filter(qset)
return base_filter