присоединиться к столам с Django - PullRequest
4 голосов
/ 23 июля 2010
queryObj = Rating.objects.select_related(
    'Candidate','State','RatingCandidate','Sig','Office','OfficeCandidate').get(
        rating_id = ratingId, 
        ratingcandidate__rating = ratingId,
        ratingcandidate__rating_candidate_id = \
             officecandidate__office_candidate_id)

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

ratingcandidate__rating_candidate_id = officecandidate__office_candidate_id.  

Мне нужно пропустить, чтобы получить все данные.

Ответы [ 2 ]

13 голосов
/ 23 июля 2010

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

Не пытайтесь «объединять» таблицы. Это не SQL.

Чтобы получить данные из разных таблиц, вам нужно сделать несколько попыток.

Не беспокойтесь о select_related, пока не докажете, что у вас есть горлышко бутылки.

Просто делайте различные GET из различных классов по мере необходимости.

Давайте сосредоточимся на кандидате и рейтинге.

class Rating( Model ):
    ...

class Candidate( Model ):
    rating = Models.ForeignKey( Rating )

Сделай это.

r = Rating.objects.get( id=rating_id )
c = r.candidate_set.all()

Это получит рейтинг и всех кандидатов, которые имеют этот рейтинг. По сути, это соединение SQL: это две выборки. В Django ORM просто напишите две выборки как можно проще. Пусть Django (и ваша база данных) кешируют вещи для вас.

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

По виду:

r = Rating.objects.get( id=rating_id )
return render_to_response( some_form, { 'rating':r } )

В шаблоне:

Rating: {{rating}}.  Candidates: {% for c in rating.candidate_set.all %} {{c}} {%endfor%}

Etc.

Вы просто «перемещаетесь» среди своих объектов в шаблоне, чтобы отобразить запрошенную информацию.

2 голосов
/ 23 июля 2010

Вы не можете использовать синтаксис с двойным подчеркиванием в правой части выражения. Если вам нужно ссылаться на имена полей справа, используйте функцию F():

ratingcandidate__rating_candidate_id = F('officecandidate__office_candidate_id')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...