On 16 août, 08:14, shacker <[email protected]> wrote:
> I'm trying to figure out why this works:
>
> >>> comments = Comment.objects.all()
> >>>[c.content_object for c in comments]
>
> [returns a list of the objects the comments are attached to]
>
> But this doesn't:
>
> >>> c = Comment.objects.filter(id=111)
> >>> c
>
> [<Comment: Related object name here ...>]>>> c.content_object
>
> Traceback (most recent call last):
> File "<console>", line 1, in <module>
> AttributeError: 'QuerySet' object has no attribute 'content_object'
Of course. As the error message says, 'c' is here a queryset, not a
model object. If you want to retrieve a single model object, you have
to use manager.get, not manager.filter, ie:
>>> c = Comment.objects.get(id=111)
>>> c
<Comment: Related object name here ...>
>>> c.content_object
# your content object here
> The problem I'm trying to solve is that I've got a context processor
> that retrieves recent comments:
>
> def recent_comments(request):
> return {'recent_comments': Comment.objects.filter().order_by('-id')
> [:6]}
>
> But if an item has been unpublished but still has comments attached to
> it, it crashes. So I want to alter the query in the content processor
> to only grab comments on items that have publish=True.
You won't be able to do this in a single SQL query. A Q&D solution
might be:
def recent_comments(request):
comments = Comment.objects.all().order_by('-id')
recent_comments = []
for comment in comments:
if len(recent_comments) == 6: # XXX hardcoded, that's bad
break
content = comment.content_object()
try:
if content.publish:
recent_comments.append(comment)
except AttributeError
# content has no 'publish' attribute
pass
return dict(recent_comments=recent_comments)
If your comments are all on a same model class, you can possibly
optimize this by first retrieving a list of published objects AND the
content_type id for your model class, then filtering comments on these
values (implementation left as an exercice to the reader !-))
HTH
--
You received this message because you are subscribed to the Google Groups
"Django users" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/django-users?hl=en.