如何在python中过滤列表的dict?

时间:2013-01-08 06:03:30

标签: python django list dictionary

我有一个由django构建的博客应用程序,如果有新评论我想告知bloger,所以这就是我所做的

class Blog(models.Model):
     lastview = models.DateTimeField('self last view date')

class Comment(models.Model):
     blog = models.ForeignKey(Blog)
     timestamp = models.DateTimeField('comment date')

user_blog_list = Blog.Objects.filter(author = request.user)
user_blog_com = {}

for blog in user_blog_list:
      user_blog_com [blog] =list(Comment.objects.filter(blog = blog ))

现在user_blog_com看起来像是

{
  (Blog: blogname1):[(Comment:comment1),(Comment:comment2)],
  (Blog: blogname2):[(Comment:comment1),(Comment:comment2)],
}

接下来我需要将每个评论的时间戳与博客的lastview进行比较,以确定评论是否被bloger查看,但我不知道如何。

我想要的是像

这样的光盘
{
  (Blog: blogname):[(Comment:unviewed_comment),(Comment:unviewed_comment)],
}

请帮助!!!

我试试这个

user_blog_com = {}

for blog in user_blog_list:
      user_blog_com [blog] =list(Comment.objects.filter(blog = blog ,timestamp > blog.lastview ))

 get an error: non-keyword arg after keyword arg

2 个答案:

答案 0 :(得分:3)

我还没有对它进行测试,但以下内容应该为您提供每个博客的新评论列表。

from django.db.models import F

comments = Comment.objects.filter(
        blog__author=request.user
    ).filter(
        timestamp__gte=F('blog__lastview')
    ).select_related('blog').order_by('blog')

F() Expressions允许您逐行引用数据库中的值。除此之外,您只是要求所有新评论timestamp__gte=blog__lastview,其中当前用户是作者。我们使用select_related,因此您可以访问blog实例上的详细信息而无需其他查询,并order_by('blog')以便您有一些订购。

如果您必须在字典中提供此信息(我想知道为什么会出现这种情况..),那么您可以执行以下操作:

from collections import defaultdict
d = defaultdict(list)
for comment in comments:
    d[comment.blog.name].append(comment)

比你试图构建它的方式更具可读性和表现力。

答案 1 :(得分:1)

试试这个

ret_dict = {}
for k, v in user_blog_com.items():
    # Check comments timestamp is smaller than lastview.
    ret_dict[k] = [x for x in v if x.timestamp <= k.lastview]

print ret_dict

这可能会对你有帮助。