2010-04-08 46 views
-1

我的视图中有一个django查询集,其值在传递到我的模板之前打包。查询集返回none时出现问题,因为关联值未解包。 quersyet被称为comments匹配django queryset中可选字段的空白条目以及相应的字段在必填字段中

这里是我的views.py

def forums(request): 


post_list = list(forum.objects.filter(child='0')&forum.objects.filter(deleted='0').order_by('postDate')) 
user = UserProfile.objects.get(pk=request.session['_auth_user_id']) 
newpostform = PostForm(request.POST) 
deletepostform = PostDeleteForm(request.POST) 
DelPostFormSet = modelformset_factory(forum, exclude=('child','postSubject','postBody','postPoster','postDate','childParentId')) 
readform = ReadForumForm(request.POST) 
comments =list(forum.objects.filter(deleted='0').filter(child='1').order_by('childParentId').values('childParentId').annotate(y=Count('childParentId'))) 


if request.user.is_staff== True : 
    staff = 1 
else: 
    staff = 0 
staffis = 1 




if newpostform.is_valid(): 
    topic = request.POST['postSubject'] 
    poster = request.POST['postPoster'] 
    newpostform.save() 
    return HttpResponseRedirect('/forums') 

else: 
    newpostform = PostForm(initial = {'postPoster':user.id}) 

if request.GET: 
    form = SearchForm(request.GET) 
    if form.is_valid(): 
     query = form.cleaned_data['query'] 
     post_list = list((forum.objects.filter(child='0')&forum.objects.filter(deleted='0')&forum.objects.filter(Q(postSubject__icontains=query)|Q(postBody__icontains=query)|Q(postDate__icontains=query)))or(forum.objects.filter(deleted='0')&forum.objects.filter(Q(postSubject__icontains=query)|Q(postBody__icontains=query)|Q(postDate__icontains=query)).values('childParentId'))) 

if request.method == 'POST': 
    delpostformset = DelPostFormSet(request.POST) 
    if delpostformset.is_valid(): 
     delpostformset.save() 
     return HttpResponseRedirect('/forums') 

else: 
    delpostformset = DelPostFormSet(queryset=forum.objects.filter(child='0', deleted='0')) 



"""if readform.is_valid(): 
    user=get_object_or_404(UserProfile.objects.all()) 
    readform.save() 
else: 
    readform = ReadForumForm()""" 

post= zip(post_list,comments, delpostformset.forms) 
paginator = Paginator(post, 10) # Show 10 contacts per page 

# Make sure page request is an int. If not, deliver first page. 
try: 
    page = int(request.GET.get('page', '1')) 
except ValueError: 
    page = 1 

# If page request (9999) is out of range, deliver last page of results. 
try: 
    post = paginator.page(page) 
except (EmptyPage, InvalidPage): 
    post = paginator.page(paginator.num_pages) 

return render_to_response('forum.html', {'post':post, 'newpostform': newpostform,'delpost':delpostformset, 'username':user.username, 'comments':comments, 'user':user, },context_instance = RequestContext(request)) 

我意识到,这个问题是与comments查询集comments =list(forum.objects.filter(deleted='0').filter(child='1').order_by('childParentId').values('childParentId').annotate(y=Count('childParentId')))这将只对有意见的帖子返回值。所以我现在需要一种方式来返回0评论当post-listpost_list = list(forum.objects.filter(child='0')&forum.objects.filter(deleted='0').order_by('postDate'))中的值没有任何评论(可选字段)。

这里是我的models.py

class forum(models.Model): 
    postID = models.AutoField(primary_key=True) 
    postSubject = models.CharField(max_length=100) 
    postBody = models.TextField() 
    postPoster = models.ForeignKey(UserProfile) 
    postDate = models.DateTimeField(auto_now_add=True) 
    child = models.BooleanField() 
    childParentId = models.ForeignKey('self',blank=True, null=True) 
    deleted = models.BooleanField() 

    def __unicode__(self): 
     return u' %d' % (self.postID) 

回答

3

你可能只是这样做:

comments = list(queryset or []) 

如果查询集解析为无,那么将使用空列表和comments将只是一个空的清单。

+0

这仍然不适用于'post_list = list(forum.objects.filter(child ='0')&forum.objects.filter(deleted ='0')。order_by('postDate'))' – 2010-04-09 07:49:03

0

我不认为你做得对。我不相信queryset可以返回None。为什么不链接filter方法?

list(forum.objects.filter(child='0').filter(deleted='0').order_by('postDate')) 

如果你有更复杂的查询,你可以使用Django的Query objects,它允许您使用&|逻辑运算符。

+0

是的,它不会返回任何内容。问题在于我正在压缩两个查询中的值,'post-list'和'comments',因此它们需要在数量上相等,但是'comments'只会在'post-list'中的值有注释时返回值。所以如何补偿这样的问题,即如果'post-list'没有评论,我总是会在评论中得到'0'。 – 2010-04-12 07:51:21

+0

'zip'不需要两个列表具有相同的长度。请详细解释** **和**简明**你的问题是什么,我相信会找到一个解决方案。 – 2010-04-12 09:25:37

+0

Olivier,我的问题是使用'comments'查询。我需要它为每个不同的'postID'获取'childParentId'的数量。 'childParentId'用于表示具有特定'postId'的帖子的评论,因此2对于帖子及其评论类似。到目前为止,我的代码适用于有评论的帖子,但是将所有未评论的帖子作为1帖子(因为所有未评论帖子的'childParentId'是'None' – 2010-04-13 21:44:09