Сопоставление пустых записей в наборе запросов django для необязательного поля с соответствующими записями в обязательном поле - PullRequest
0 голосов
/ 09 апреля 2010

В моих представлениях есть набор запросов django, значения которого я упаковываю перед передачей в свой шаблон. Существует проблема, когда набор запросов возвращает none, поскольку связанные значения не распакованы. Quersyet называется comments.

Вот мои 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 queryset comments =list( forum.objects.filter(deleted='0').filter(child='1').order_by('childParentId').values('childParentId').annotate(y=Count('childParentId'))), который будет возвращать значения только для постов с комментариями. так что теперь мне нужен способ вернуть 0 комментариев, когда значение в post-list post_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)

Ответы [ 2 ]

3 голосов
/ 09 апреля 2010

Вы могли бы просто сделать это:

comments = list(queryset or [])

если набор запросов разрешается в None, будет использоваться пустой список, а comments будет просто пустым списком.

0 голосов
/ 11 апреля 2010

Я не думаю, что вы делаете это правильно. Я не верю, что набор запросов может вернуть None. Почему бы просто не связать filter методы?

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

Если у вас есть более сложные запросы, вы можете использовать Объекты запросов из django, которые позволяют использовать логические операторы & и |.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...