如何在Tastypie中实现原始sql查询

时间:2014-10-15 17:43:05

标签: tastypie

我正在尝试执行此简单查询,但它不起作用。感谢。

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有许多不必要的查询,我不知道如何摆脱它。例如,在表上查询外键触发查询另一个表的数据,我不想得到。

1 个答案:

答案 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