Порядок Django от общего внешнего ключа

Эй, это быстро. У меня две модели: Post и Term, и я хотел бы иметь возможность помечать и классифицировать (таксономию) сообщения, а также другие (будущие) модели. Модель My Post имеет следующие поля: заголовок, контент, опубликованный (дата), а мой термин объявлен следующим образом:

class Term(models.Model): taxonomy = models.CharField(max_length=255) name = models.CharField(max_length=255) slug = models.SlugField(max_length=50) 

Затем у меня есть модель TermRelation, в которой используются термины «Должности» и другие модели, например:

 class TermRelation(models.Model): term = models.ForeignKey(Term) object_id = models.PositiveIntegerField() content_type = models.ForeignKey(ContentType) content_object = generic.GenericForeignKey() 

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

 ctype = ContentType.objects.get_for_model(Post) relations = TermRelation.objects.filter(content_type__pk=ctype.id) 

И он отлично работает, хотя он отсортирован по соотношению PK, я думаю. Когда я пытаюсь сделать следующее:

 relations = TermRelation.objects.filter(content_type__pk=ctype.id).order_by('content_object__published') 

Я получаю сообщение о том, что в TermRelation нет поля content_object. Я знаю, что должен быть способ решить эту проблему. Есть идеи?

Спасибо ~ K

Да, я был прав относительно простого SQL-запроса с соединением. На самом деле несколько присоединяется. Вот что сработало для меня (django> = 1.2 для метода raw() )

 data = { 'posts': Post._meta.db_table, 'relations': TermRelation._meta.db_table, 'terms': Term._meta.db_table, 'tag_id': tag.id } posts = Post.objects.raw('SELECT %(posts)s.* FROM %(posts)s JOIN %(relations)s ON %(posts)s.id = %(relations)s.object_id JOIN %(terms)s ON %(relations)s.term_id = %(terms)s.id WHERE %(terms)s.id = %(tag_id)s ORDER BY %(posts)s.published DESC' % data) 

Это было не так сложно. Может быть, я должен завершить это методом TermRelation, что вы думаете?

Обновление. Я включил его в статический метод и сделал его более универсальным для работы с различными типами контента и сортировкой заказов. Он все еще предполагает, что есть поле, называемое content_type_id, которое создается по умолчанию, если в ContentType есть внешний ключ. Вот код:

 @staticmethod def get_objects_by_term_id(model=None, taxonomy=None, term_id=None, order_by='NULL'): data = { 'objects': model._meta.db_table, 'content_type': ContentType.objects.get_for_model(model).id, 'relations': TermRelation._meta.db_table, 'terms': Term._meta.db_table, 'term_id': term_id, 'order_by': ' ORDER BY %s ' % order_by } return model.objects.raw('SELECT %(objects)s.* FROM %(objects)s JOIN %(relations)s ON %(objects)s.id = %(relations)s.object_id AND %(relations)s.content_type_id = %(content_type)s JOIN %(terms)s ON %(relations)s.term_id = %(terms)s.id WHERE %(terms)s.id = %(term_id)s %(order_by)s' % data) 

Насколько я знаю, это невозможно с django, потому что order_by -arguments переведены в столбцы / таблицы базы данных, а content_object не выходит в базе данных, подобной этой. Это также является причиной того, что вам нужно искать тип содержимого с помощью object_id / content_type …