В Джанго 1.2:
У меня есть набор запросов с дополнительным параметром, который ссылается на таблицу, которая в данный момент не включена в запрос, сгенерированный django для этого набора запросов.
Если я добавлю order_by к набору запросов, который ссылается на другую таблицу, django добавит соединения к другой таблице надлежащим образом, и дополнительные работы. Но без order_by дополнительный параметр не работает. Я мог бы просто добавить бесполезный вторичный order_by к чему-то в другой таблице, но я думаю, что должен быть лучший способ сделать это.
Что такое функция django для разумного добавления соединений? Я знаю, что это должно быть где-то вызвано.
Вот пример кода. Он выбирает все показания для данного пользователя и аннотирует результаты оценкой (если таковая имеется) другого пользователя, хранящейся в «друге».
class Book(models.Model):
name = models.CharField(max_length=200)
urlname = models.CharField(max_length=200)
entrydate=models.DateTimeField(auto_now_add=True)
class Reading(models.Model):
book=models.ForeignKey(Book,related_name='readings')
user=models.ForeignKey(User)
rating=models.IntegerField()
entrydate=models.DateTimeField(auto_now_add=True)
readings=Reading.objects.filter(user=user).order_by('entrydate')
friendrating='(select rating from proj_reading where user_id=%d and \
book_id=proj_book.id and rating in (1,2,3,4,5,6))'%friend.id
readings=readings.extra(select={'friendrating':friendrating})
на данный момент показания не будут работать, потому что соединение с показаниями настроено неправильно. однако, если я добавлю заказ, например:
.order_by('entrydate','reading__entrydate')
Джанго волшебным образом знает, как добавить внутреннее соединение через внешний ключ, и я получаю то, что хочу.
дополнительная информация:
print readings.query ==>
select ((select rating from proj_reading where user_id=2 and book_id=proj_book.id and rating in (1,2,3,4,5,6)) as 'hisrating', proj_reading.id, proj_reading.user_id, proj_reading.rating, proj_reading.entrydate from proj_reading where proj_reading.user_id=1;
при условии,
user.id = 1
friend.id = 2
ошибка:
OperationalError: Unknown column proj_book.id in 'where clause'
и это происходит потому, что таблица proj_book не включена в запрос. Чтобы повторить то, что я сказал выше - если я сейчас делаю readings2 = readings.order_by ('book__entrydate'), я вижу, что установлено правильное соединение и запрос работает.
В идеале я хотел бы просто выяснить, как называется функция qs.query, которая просматривает две таблицы и выясняет, как они соединяются внешними ключами, и просто вызывать это вручную.