Как реализовать необработанный sql-запрос в 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) Если реализация метода обезвоживания является правильным способом сделать это? Если это так, указанное выше не работает. Он должен вернуть объект пакета. Как построить новый бандл?

Если вышеуказанный метод в порядке, я заметил, что пакет уже создал поле .data с запросом по умолчанию (?), Которое будет выброшено с новым запросом. Это вызывает вопросы, правильно ли это делать.

2) Если есть другой метод raw sql для этого? Где выполнить sql?

3) Как это сделать в фильтре?

4) Я знаю sql и не знаком со сложным фильтром. Вот почему я пытаюсь использовать необработанный метод sql для создания быстрого прототипа. В чем недостаток? Я заметил, что при использовании Tastypie возникает много ненужных запросов, от которых я не знаю, как от них избавиться. Пример: запрос к таблице с триггерным запросом внешнего ключа к данным другой таблицы, которые я не хочу получать.


person user3792705    schedule 15.10.2014    source источник


Ответы (1)


Я разобрался с фильтром, и он вроде сработал. Но меня все еще интересует 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
person user3792705    schedule 15.10.2014