Django - после отношения внешнего ключа (т. Е. JOIN в SQL) - PullRequest
0 голосов
/ 05 августа 2009

Занят игрой с django, но меня, кажется, сбивает с толку одна вещь - следование отношениям с внешними ключами. Теперь у меня есть огромный опыт написания SQL, так что я могу попробовать. вернуть результат, если ORM не было.

По сути, это SQL-запрос, который я хочу вернуть

Select
  table1.id
  table1.text
  table1.user
  table2.user_name
  table2.url
from table1, table2
where table1.user_id = table2.id

Мои классы моделей были определены как:

class Table1(models.Model):
    #other fields
    text        = models.TextField()
    user        = models.ForeignKey('table2')

class Table2(models.Model):
    # other fields
    user_name = models.CharField(max_length=50)
    url = models.URLField(blank=True, null=True)

Я ознакомился с документацией и справочными материалами по наборам запросов, моделям и представлениям на веб-сайте django. Но до сих пор не ясно, как это сделать.

Я также настроил URL с общим представлением списка, но хотел бы получить доступ к полю user_name из второй таблицы в шаблоне. Я попытался select_related в urls.py, а также через оболочку, но, похоже, не работает. Смотрите примеры ниже.

конфиг в URL

url(r'^$','django.views.generic.list_detail.object_list', { 'queryset': Table1.objects.select_related() }),

На скорлупе

>>> a = Table1.objects.select_related().get(id=1)
>>> a.id
1
>>> a.user_name
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'Table1' object has no attribute 'user_name'

Так в основном,

  • Что я делаю не так?
  • Я что-то упустил?
  • Каков наилучший способ передачи полей из двух таблиц в одном и том же наборе запросов в шаблон (чтобы можно было получить доступ к полям из обеих таблиц)
  • Можно ли это сделать с помощью общих представлений?

Ответы [ 2 ]

3 голосов
/ 05 августа 2009

Примерно так должно работать:

u = Table1.objects.get(id=1)
print u.id
print u.user.user_name

Если вы хотите следовать внешнему ключу, вы должны сделать это явно. Вы не получаете автоматическое соединение, когда вы извлекаете объект из Table1. Вы получите объект только из таблицы 2, когда получите доступ к полю внешнего ключа, в данном примере это пользователь

2 голосов
/ 05 августа 2009

select_related () не добавляет второй результат таблицы непосредственно к запросу, он просто «загружает» их, вместо того, чтобы лениво давать вам. Вы должны использовать его только тогда, когда уверены, что это может повысить производительность вашего сайта. Чтобы получить вторую таблицу нужно написать

a.user.username

В Django, чтобы получить связанную таблицу, вы должны следовать за ними через внешние ключи, которые вы разработали. Сам запрос не переводится напрямую в SQL-запрос, потому что он «ленивый». Он будет выполнять только тот SQL, который вам нужен, и только тогда, когда вам нужно.

Если у вас select_related SQL был бы выполнен в тот момент, когда вы выполняете оригинальный запрос для a. Но если бы у вас не было select_related, тогда БД загружалась бы только тогда, когда вы действительно выполняете a.user.username.

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