-
Есть модель
К которой прикручены автоматические джанговские комментарии.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) -
Можно пойти с другой стороны - выбрать все категории по указанному критерию, а затем для них - комментарии.
т.е. сделать как-то так:
?articles = Article.objects.filter(category = my_category).all()
for article in articles:
comments = comments | article.comments.all()
не будет ли такой цикл слишком медленным? статей понятное дело много не планируется, но все же... -
Можно как-то так:
В зависимости от того, запрашивался ли до этого contenttype для Article, - 2 или 3 sql-запроса. Можно еще только id'шники у статей доставать.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]
)
+ небольшое замечание, .all() писать незачем -
Михаил, Большое Вам Спасибо.
-
У меня такое подозрение, что я уже отвечал на подобный вопрос - http://softwaremaniacs.org/forum/django/11990/#63456
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

