Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » реализовать через orm, выборка с учетом двух моделей [RSS Feed]

#1 Янв. 31, 2009 05:43:40

Evg
От:
Зарегистрирован: 2008-12-25
Сообщения: 346
Репутация: +  -1  -
Профиль   Отправить e-mail  

реализовать через orm, выборка с учетом двух моделей

Есть теги и некие объекты, а конкретнее две модели:
1-я:

class Item(models.Model):
title = models.TextField(blank=False)
date = models.DateTimeField(auto_now_add=True)
2-я из приложения django-tagging:
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')
нужно сделать отбор ‘страницы’ (limit x,y) объектов с заданными тегами отсортированных по полю из 1-й модели

т.е на sql это выглядело бы !примерно так:
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
можно как нибудь это красиво записать через сам orm?



Отредактировано (Янв. 31, 2009 05:52:12)

Офлайн

#2 Янв. 31, 2009 13:53:23

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

реализовать через orm, выборка с учетом двух моделей

Никогда, никогда не ставьте так вопрос - “вот есть SQL как сделать на ORM”! Это ущербный путь. У вас есть другой иструмент нежели SQL. Решайте задачу его средствами и оптимизируейте (если необходимо!). Тащить в джагу концепции других технологий не стоит, вы просто не сможете их эффективно использовать.



Офлайн

#3 Янв. 31, 2009 21:57:07

Evg
От:
Зарегистрирован: 2008-12-25
Сообщения: 346
Репутация: +  -1  -
Профиль   Отправить e-mail  

реализовать через orm, выборка с учетом двух моделей

ну а как тогда лучше делать? фильтр по 1-й модели+проверку что item.id внутри списка id-ов итемов с заданными тегами?

и почему ущербный путь? если орм гнерирует sql то почему бы не задумываться о том каким он будет из соображений скорости, и стараться написать орм код так чтобы запрос был наиболее близок к эффективному запросу?



Отредактировано (Янв. 31, 2009 22:12:48)

Офлайн

#4 Фев. 2, 2009 11:14:11

Evg
От:
Зарегистрирован: 2008-12-25
Сообщения: 346
Репутация: +  -1  -
Профиль   Отправить e-mail  

реализовать через orm, выборка с учетом двух моделей

да, что-то я совсем не заметил эти методы..
кстати внутри сделано через чистый 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),
}



Офлайн

  • Начало
  • » Django
  • » реализовать через orm, выборка с учетом двух моделей[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version