Форум сайта python.su
Есть теги и некие объекты, а конкретнее две модели:
1-я:
class Item(models.Model):
title = models.TextField(blank=False)
date = models.DateTimeField(auto_now_add=True)
class TaggedItem(models.Model):
"""
Holds the relationship between a tag and the item being tagged.
"""
tag = models.ForeignKey(Tag, verbose_name=_('tag'), related_name='items')
content_type = models.ForeignKey(ContentType, verbose_name=_('content type'))
object_id = models.PositiveIntegerField(_('object id'), db_index=True)
object = generic.GenericForeignKey('content_type', 'object_id')
select distinct i.id from Item i
left join TaggedItem t on (t.object_id = i.id and t.content_type = x)
where t.tag_id in (1,2..N) order by i.created limit start,len
Отредактировано (Янв. 31, 2009 05:52:12)
Офлайн
Никогда, никогда не ставьте так вопрос - “вот есть SQL как сделать на ORM”! Это ущербный путь. У вас есть другой иструмент нежели SQL. Решайте задачу его средствами и оптимизируейте (если необходимо!). Тащить в джагу концепции других технологий не стоит, вы просто не сможете их эффективно использовать.
Офлайн
ну а как тогда лучше делать? фильтр по 1-й модели+проверку что item.id внутри списка id-ов итемов с заданными тегами?
и почему ущербный путь? если орм гнерирует sql то почему бы не задумываться о том каким он будет из соображений скорости, и стараться написать орм код так чтобы запрос был наиболее близок к эффективному запросу?
Отредактировано (Янв. 31, 2009 22:12:48)
Офлайн
да, что-то я совсем не заметил эти методы..
кстати внутри сделано через чистый sql а не orm почти такой же как я предположил выше запрос:
SELECT %(model_pk)s
FROM %(model)s, %(tagged_item)s
WHERE %(tagged_item)s.content_type_id = %(content_type_id)s
AND %(tagged_item)s.tag_id IN (%(tag_id_placeholders)s)
AND %(model_pk)s = %(tagged_item)s.object_id
GROUP BY %(model_pk)s“”" % {
‘model_pk’: ‘%s.%s’ % (model_table, qn(model._meta.pk.column)),
‘model’: model_table,
‘tagged_item’: qn(self.model._meta.db_table),
‘content_type_id’: ContentType.objects.get_for_model(model).pk,
‘tag_id_placeholders’: ‘,’.join( * tag_count),
}
Офлайн