2016-01-27 2 views
2

Я использую MySQL с Django и не могу видеть данные, возвращенные из запроса, выполненного в моем диспетчере моделей.Отображение данных, возвращаемых диспетчером модели в django

Страница обрабатывается таблицей, границами и разбиением на страницы работает, однако ни одно из значений полей не отображается в таблице.

Я предполагаю, что между возвратом результатов запроса и представлением его в html требуется шаг, но я в тупике.

Для контекста, я настраиваю своего менеджера, поэтому я могу выполнять более сложные запросы, чем то, что предлагается с Django.

Я последовал некоторые примеры использования модели менеджеров с довольно простым запросом, как старт - .. один из многих ссылок я исследуемая за пределами этого сайта: https://docs.djangoproject.com/en/dev/topics/db/managers/#custom-managers

После тратить много времени на поиск я доверяю кому-то здесь может помочь. Заранее спасибо!!

Вот модель менеджера:

class ElectionsManager(models.Manager): 
def is_active(self): 
    from django.db import connection 
    cursor = connection.cursor() 
    cursor.execute(""" 
        SELECT * 
        FROM 
         newvoterproject.fullvh vh1 
        WHERE 
        vh1.city = 'Glocester' and 
        vh1.current_party = 'd' 
        group by 
         vh1.city, 
         vh1.street_name, 
         vh1.street_name_2, 
         vh1.street_number, 
         vh1.unit 
        ;""") 
    result_list = cursor.fetchall() 
    return result_list 

и здесь надрез модели:

class Election(models.Model): 
voter_id = models.CharField(primary_key=True, max_length=25) 
last_name = models.CharField(max_length=50, blank=True, null=True) 
first_name = models.CharField(max_length=50, blank=True, null=True) 
middle_name = models.CharField(max_length=50, blank=True, null=True) 
current_party = models.CharField(max_length=50, blank=True, null=True) 
street_number = models.CharField(max_length=50, blank=True, null=True) 
street_name = models.CharField(max_length=50, blank=True, null=True) 
street_name_2 = models.CharField(max_length=50, blank=True, null=True) 
unit = models.CharField(max_length=50, blank=True, null=True) 
city = models.CharField(max_length=50, blank=True, null=True) 
state = models.CharField(max_length=50, blank=True, null=True) 
zip_code = models.CharField(max_length=50, blank=True, null=True) 
zip_code_4 = models.CharField(max_length=50, blank=True, null=True) 
precinct = models.CharField(max_length=50, blank=True, null=True) 
status = models.CharField(max_length=50, blank=True, null=True) 
objects = ElectionsManager() # model manager 

class Meta: 
    managed = False 
    verbose_name = 'Election' 
    verbose_name_plural = 'Elections' 
    db_table = 'fullvh' 

def __str__(self): 
    return '%s %s' % (self.first_name, self.last_name) 

Вызов менеджера модели с точки зрения:

def vhistfun(request): 
election_table = Election.objects.is_active() 
paginator = Paginator(election_table , 25) # Show 25 contacts per page - may want to change this to READ 25 at a time... 
page = request.GET.get('page') 
try: 
    electpage = paginator.page(page) 
except PageNotAnInteger: 
    electpage = paginator.page(1) 
except EmptyPage:  
    electpage = paginator.page(paginator.num_pages) 

context = {'electpage': electpage, 
      } 
return render(request, 'elections/electable.html', context) 

.. и html snip обработка результатов

{% for elect in electpage %} 
    <tr id="voterrowclass" class=""> 
     <td> {{ elect.first_name|lower|capfirst }} </td> 
     <td> {{ elect.last_name|lower|capfirst }} </td> 
     <td> {{ elect.current_party}} </td> 
     <td> {{ elect.street_number}} {{ elect.unit}} </td> 
     <td> {{ elect.street_name|lower|capfirst}} {{ elect.street_name_2|lower|capfirst}} </td> 
     <td> {{ elect.city|lower|capfirst}} </td> 
    </tr> <!-- # model data sent from view --> 
{% endfor %} 

ответ

0

Ваш метод настраиваемого менеджера не возвращается Объекты выборов; он возвращает кортежи, представляющие строки базы данных. Таким образом, вы не можете ссылаться на результаты в своем шаблоне по имени поля, как если бы они были объектами.

Действительно, для этого не предназначены менеджеры; ваши методы менеджера всегда должны возвращать запросы.

+0

Так что есть способ преобразовать результаты в набор итерируемых объектов? функции набора запросов в django не будут работать для моих нужд. – catonalake

+0

Они повторяемы; проблема не в цикле for, это факт, что вы ссылаетесь на каждое поле по имени, тогда как у вас есть только кортеж значений. Однако вы, вероятно, должны использовать метод запроса '' raw' '(https://docs.djangoproject.com/en/1.9/topics/db/sql/#performing-raw-queries) вместо прямого вызова курсора, так как который отображает имена полей. –

0

Спасибо за понимание.

Я сделал несколько изменений и попробовал работать, но без использования диспетчера модели (пока).

  • Я удалил ссылку на мою модель менеджер в models.py сейчас - (я могу добавить, что еще в последующих итерациях/при рефакторинге)
  • Использования сырого вызова SQL в мою базу данных я был успешным в работать с результатами достаточно простого запроса (правильные данные заполняемых в моем HTML - не требуется никаких изменений в HTML)

Вот улучшенный вид, который получил все заработало:

def vhistfun(request): 
election_table = Election.objects.raw(""" 
       SELECT * 
      FROM 
       newvoterproject.fullvh vh1 
      WHERE 
       vh1.city = 'Glocester' 
        AND (vh1.current_party = 'r' or vh1.current_party = 'u') 
        GROUP BY vh1.city , 
        vh1.street_name , 
        CONVERT(SUBSTRING_INDEX(vh1.street_number,'-',-1),UNSIGNED INTEGER) , 
        vh1.unit 
      ; 
        """) 
party_list=('r','u') 
town_list=('Glocester') 
query_information ='Voters in the 2012 Presidential Election (election_3) and either the 2008 Presidential Election (election_8)or the 2012 Presidential Primary (election_5)' 

paginator = Paginator(list(election_table), 10) # NOTE > this was changed from paginator = Paginator(election_table , 25) 
page = request.GET.get('page') 
try: 
    electpage = paginator.page(page) 
except PageNotAnInteger:  
    electpage = paginator.page(1) 
except EmptyPage:  
    electpage = paginator.page(paginator.num_pages) 

context = {'electpage': electpage, 
      'party_list': party_list, 
      'town_list': town_list, 
      'query_information ': query_information 
      } 
return render(request, 'elections/electable.html', context) 

Только примечание/осторожность - с использованием объектов.сырье вызвало эту проблему с пагинацией:

object of type 'int' has no len() 

я узнал, как это исправить здесь: Django paginator and raw SQL

сейчас я получаю мой стол, заполненный данные и перейти к более сложным запросам я, необходимые для мой проект ....

Я оставляю этот вопрос без ответа. Хотя мне удалось получить данные, которые мне нужны, используя raw, это не касается заданного вопроса - почему запрос в диспетчере моделей не правильно отображает данные на html ...

Смежные вопросы