Простой поиск Django в Django App Engine?

В моем проекте Django, который собирает статистику игроков NBA (в качестве учебного проекта), я создал простое представление поиска, которое позволяет вам искать игроков по имени или фамилии (или по обоим). Он отлично работает на сервере разработки, но теперь я хочу развернуть свой сайт с помощью Google App Engine, и я получаю ошибки, которые, как я полагаю, связаны с хранилищем данных высокой репликации GAE.

У меня сложилось впечатление, что Инструменты Django-nonrel/dbindexer помогли бы решить эту проблему, но до сих пор я безуспешно пытался их внедрить - когда я пытаюсь выполнить поиск на своем сайте, я получаю журнал ошибок с сообщением: «DatabaseError: этот запрос не поддерживается базой данных».

Я предполагаю, что моя проблема может заключаться в том, что инструкции для этих инструментов разбросаны по нескольким документам, написанным на разных этапах их разработки, поэтому мне сложно собрать их вместе в одну связную картину. Кроме того, я просмотрел предлагаемое ими тестовое приложение, и, похоже, оно настроено несколько иначе, чем предлагается в их инструкциях. Итак, я хотел бы задать два вопроса:

1) Можно ли использовать представление, которое я закодировал, с GAE и Django-nonrel/dbindexer? Вот:

def search(request):
        query = request.GET.get('q','')
        querywords = query.split(' ')
        lname=''
        for word in querywords[1:-1]:
                lname += word+' '
        lname += querywords[-1]
        if query:
                if len(querywords)>1:
                        qset = (
                                Q(first_name__iexact=querywords[0]) &
                                Q(last_name__iexact=lname) 
                        )
                        exact_results = Player.objects.filter(qset).distinct()
                        if exact_results != []:
                                result = exact_results
                                qset = (
                                        Q(first_name__icontains=querywords[0])|
                                        Q(last_name__icontains=querywords[0])|
                                        Q(first_name__icontains=lname)|
                                        Q(last_name__icontains=lname)   
                                )
                                results = Player.objects.filter(qset).distinct()
                                results = results.order_by('last_name','first_name')
                        else:
                                qset = (
                                        Q(first_name__icontains=querywords[0]) &
                                        Q(last_name__icontains=lname)|
                                        Q(first_name__icontains=querywords[0])|
                                        Q(last_name__icontains=querywords[0])
                                )
                                results = Player.objects.filter(qset).distinct()
                                results = results.order_by('last_name','first_name')
                                result = ''
                else:
                        qset = (
                                Q(first_name__icontains=querywords[0])|
                                Q(last_name__icontains=querywords[0])   
                        )
                        results = Player.objects.filter(qset).distinct()
                        results = results.order_by('last_name','first_name')
                        result = ''
        else:
                results = []
                result = ''
        return render(request,'search.html', {
                'result':result,
                'results': results,
                'query': query,
                'querywords':querywords
        })

2) Если его можно использовать, и мой проект в dev структурирован следующим образом, каков наиболее экономный набор шагов, который я могу выполнить, чтобы мое представление поиска работало правильно в GAE?

NBA/
    __init__.py
    manage.py
    settings.py
    urls.py
    templates/
            (html files)
    players/
            __init__.py
            admin.py
            models.py
            tests.py
            views.py
            fixtures/
                    (some .yaml fixture files)
            static/
                    (css, js, and gif files)

person GChorn    schedule 19.07.2012    source источник
comment
что вы имеете в виду, что он отлично работает на сервере разработки? Он правильно работает на dev_appserver?   -  person dragonx    schedule 19.07.2012
comment
Я имею в виду, что когда я запускаю свой проект с помощью python manage.py runserver, мой код работает именно так, как я хочу.   -  person GChorn    schedule 19.07.2012
comment
Я не понимаю, используете ли вы проект django или проект django-nonrel. Похоже, вы создали проект django без GAE и пытаетесь заставить его работать на GAE. На данный момент я смущен тем, что я ожидаю, что если вы настроите его правильно, вы должны увидеть тот же сбой локально. Я не вижу в вашем дереве app.yaml или папку django, которая была бы необходима для вашего проекта GAE.   -  person dragonx    schedule 19.07.2012
comment
Ты прав; Я создал проект без GAE и пытаюсь его портировать. Вся информация, которую я имею выше, относится к моему старому доброму проекту Django. Я не публиковал то, что я пробовал до сих пор, потому что это своего рода мешанина вещей, отобранных из нескольких статей и примера testapp. Я надеялся, что кто-то может дать мне более унифицированный набор шагов для переноса моего проекта, но похоже, что это невозможно.   -  person GChorn    schedule 20.07.2012
comment
Я действительно не знаю, но я предлагаю переписать приложение с помощью простых нереляционных запросов.   -  person dragonx    schedule 20.07.2012


Ответы (2)


Как правило, JOIN не поддерживаются, поэтому все объекты Q с OR, вероятно, не будут работать.

Я мало использовал dbindexer, поэтому не уверен, насколько он эффективен. Я действительно думаю, что если вы его используете, это сделает ваши запросы к хранилищу данных дорогими со всеми дополнительными индексами, которые он пытается выполнять автоматически.

Даже если вы используете django-nonrel, вы не можете ожидать прямого портирования приложения django, если оно использует реляционные данные. Вам придется реструктурировать ваши данные и запросы, чтобы они были нереляционными.

person dragonx    schedule 19.07.2012
comment
Дело в том, что я даже не могу заставить объекты Q работать с &. Поэтому мне кажется, что я что-то не так настроил. - person GChorn; 19.07.2012
comment
Я не пробовал объекты Q, поэтому не знаю, работают ли они вообще. - person dragonx; 19.07.2012

Итак, поработав с различными типами запросов с помощью «удаленной оболочки python manage.py», я пришел к следующим выводам:

1) Как уже упоминалось @dragonx, объекты Q с «ИЛИ» не поддерживаются.

2) Тем не менее, объекты Q с "&" определенно есть.

3) Проблема с моим кодом просмотра поиска, кроме запросов «ИЛИ», заключалась в добавлении «distinct()» в мой вызов «Player.objects.filter()». По-видимому, HRD не поддерживает "distinct()", и это было причиной загадочного

"DatabaseError: этот запрос не поддерживается базой данных"

сообщение. Напротив, попытка использовать объект Q с «ИЛИ» дает гораздо более полезный результат.

«DatabaseError: поддерживаются только фильтры AND»

Теперь, когда я удалил бит "distinct()" из своего кода (и любых Q-объектов, содержащих "ИЛИ"), поиск работает нормально.

person GChorn    schedule 23.07.2012