-
Есть модель
class Article(models.Model): owner = models.ForeignKey(User, editable=False) ... category = models.CharField(u'Категория', choices = CAT_CHOICES, max_length=parameters.NAME_LENGTH)
К которой прикручены автоматические джанговские комментарии.
Теперь, хотелось бы выбрать все комментарии к статьям принадлежащим к одной категории.
comments = Comment.objects.filter(content_object__category = cat).all()
На что получается
Cannot resolve keyword 'content_object' into field.
Хотя в документации по модели комментов http://docs.djangoproject.com/en/dev/ref/contrib/comments/models/ сказано что content_object есть.
что тут можно сделать? -
Почитайте http://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#id1
Due to the way GenericForeignKey is implemented, you cannot use such fields directly with filters (filter() and exclude(), for example) via the database API. They aren't normal field objects. These examples will not work:
# This will fail
>>> TaggedItem.objects.filter(content_object=guido)
# This will also fail
>>> TaggedItem.objects.get(content_object=guido)
Можно пойти с другой стороны - выбрать все категории по указанному критерию, а затем для них - комментарии.
-
category = Category.objects.get(...) category_type = ContentType.objects.get_for_model(category) comments = Comment.objects.filter(content_type=category_type, object_id=category.id)
либо используйте http://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#reverse-generic-relations -
Можно пойти с другой стороны - выбрать все категории по указанному критерию, а затем для них - комментарии.
т.е. сделать как-то так:articles = Article.objects.filter(category = my_category).all() for article in articles: comments = comments | article.comments.all()
?
не будет ли такой цикл слишком медленным? статей понятное дело много не планируется, но все же... -
Можно как-то так:
article_list = list(Article.objects.filter(category=my_category)) article_type = ContentType.objects.get_for_model(Article) comments = Comments.objects.filter( content_type=article_type, object_id__in=[item.id for item in article_list] )
В зависимости от того, запрашивался ли до этого contenttype для Article, - 2 или 3 sql-запроса. Можно еще только id'шники у статей доставать.
+ небольшое замечание, .all() писать незачем -
Михаил, Большое Вам Спасибо.
-
У меня такое подозрение, что я уже отвечал на подобный вопрос - http://softwaremaniacs.org/forum/django/11990/#63456
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

