【问题标题】:Django query object filterDjango 查询对象过滤器
【发布时间】:2014-12-10 08:51:46
【问题描述】:

我正在尝试从我的数据库中获取满足指定条件的所有对象。从我的模型Training 我需要获取与登录用户相关的所有对象,日期在指定范围内,并且指定了培训类型。 型号:

class Training(models.Model):
    user = models.ForeignKey(User)
    date = models.DateField()
    length = models.TimeField()
    distance = models.FloatField()
    type = models.CharField(max_length=2,choices=TRAINING_TYPE)
    caloriesBurnt = models.FloatField()
    weight = models.FloatField()
    description = models.TextField(max_length=25)

使用过滤器查看:

def ReportRequest(request):
    if not request.user.is_authenticated():
        return HttpResponseRedirect('/login/')
    if request.method == 'POST':
        form = ReportForm(request.POST)
        if form.is_valid():
            usrname = request.user
            q = Training.objects.filter(user=usrname)
            q = Training.objects.filter(date__range=[form.cleaned_data['start'], form.cleaned_data['end']])
            q = Training.objects.filter(type=form.cleaned_data['type'])
            quantity = q.count
            if quantity == 0:
                return HttpResponseRedirect('/notrainings/')
            avg_length = q.aggregate(Avg('length'))
            avg_distance = q.aggregate(Avg('distance'))
            avg_calories = q.aggregate(Avg('caloriesBurnt'))
            return HttpResponseRedirect('/report/')
        else:
            return render_to_response('reportform.html', {'form':form}, context_instance=RequestContext(request))
    else:
        form = ReportForm()
        return render_to_response('reportform.html',{'form':form}, context_instance = RequestContext(request))

以及用户设置数据范围和训练类型的形式:

class ReportForm(forms.Form):
    start = forms.DateField(widget=SelectDateWidget(), initial=date.today())
    end = forms.DateField(widget=SelectDateWidget(),initial=date.today())
    type = forms.ChoiceField(required=True, choices=ACTIVITY_CHOICES, initial=RUNNING)

我的问题:在我的数据库中,所有培训都是在 12 月 9 日和 10 日进行的。当我在表格中设置从 12 月 2 日到 3 日的日期范围时,它应该将我重定向到 /notrainings/。但事实并非如此。无论我使用quantity = q.count 还是quantity = q.count()。 我将非常感谢有关此主题的帮助。

已解决,感谢 Mihai 和 ruddra

【问题讨论】:

    标签: django database forms views


    【解决方案1】:

    你可以这样做:

    q = Training.objects.filter(user=usrname).filter(date__range=[form.cleaned_data['start'], form.cleaned_data['end']]).filter(type=form.cleaned_data['type'])
    
    count = q.count()
    

    【讨论】:

      【解决方案2】:

      你的问题很简单。您始终在查询Training,您不存储部分结果。最后一个被存储的查询是这个:

      q = Training.objects.filter(type=form.cleaned_data['type'])

      所以实际上你只是type的过滤功能

      你应该这样做:

      q = Training.objects.filter(user=usrname) 
      q = q.filter(date__range=[form.cleaned_data['start'], form.cleaned_data['end']]) 
      q = q.filter(type=form.cleaned_data['type'])
      

      或者如果你想要一次全部:

      q = Training.objects.filter(
          user=usrname,
          date__range=[form.cleaned_data['start'], form.cleaned_data['end']],
          type=form.cleaned_data['type'],
      ) 
      

      【讨论】:

      • 我按照你的建议做了,但现在如果我输入任何日期(好/坏),我将被重定向到 reportform,错误为 AttributeError at /reportform 'QuerySet' object has no attribute 'objects' 问题出在这一行:@987654328 @
      • 抱歉,我已经编辑了我的回复。您现在不必再次输入objectsq 不再是模型,经理已被访问。所以现在试试:)
      • 现在,如果我再次输入错误的日期,它会将我带到report,而不是应该的notrainigs。我的代码现在看起来像这样:q = Training.objects.filter(user=usrname) q = q.filter(date__range=[form.cleaned_data['start'], form.cleaned_data['end']]) q = q.filter(type=form.cleaned_data['type'])
      猜你喜欢
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 2014-01-08
      • 2011-05-19
      • 2015-02-17
      • 1970-01-01
      • 2019-12-27
      • 2018-08-05
      相关资源
      最近更新 更多