Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
django视图中的Mysql查询_Mysql_Django_Django Rest Framework_Django Mysql - Fatal编程技术网

django视图中的Mysql查询

django视图中的Mysql查询,mysql,django,django-rest-framework,django-mysql,Mysql,Django,Django Rest Framework,Django Mysql,我对mysql不太了解。我的django模型如下: class Exercise_state(models.Model): exercise = models.ForeignKey(Exercise, blank=True, null=True) user = models.ForeignKey(User, blank=True, null=True) intensity_level = models.IntegerField(default='1')

我对mysql不太了解。我的django模型如下:

 class Exercise_state(models.Model):
     exercise = models.ForeignKey(Exercise, blank=True, null=True)
     user = models.ForeignKey(User, blank=True, null=True) 
     intensity_level = models.IntegerField(default='1')
     progress = models.IntegerField(default='0')
     current_date = models.DateField(auto_now=True)
     user_rating = models.IntegerField(default='0')
我想检索满足锻炼id=1对应强度水平=7的用户id的计数,依此类推,直到7为止。简而言之,在所有练习中达到强度水平=7的用户

我写了一个查询,如下所示:

select count(user_id) from demo_exercise_state where 
exercise_id=1 and intensity_level=7 and
exercise_id=2 and intensity_level=7 and
exercise_id=3 and intensity_level=7 and 
exercise_id=4 and intensity_level=7 and
exercise_id=5 and intensity_level=7 and
exercise_id=6 and intensity_level=7 and
exercise_id=7 and intensity_level=7;
就我可以直接交叉检查数据库中的结果而言,没有任何用户完成了训练(即,在所有训练类型中达到强度水平=7),因此它将计数返回为“0”

我确信这个查询可以优化,因为有很多重复,但我不确定如何优化

我还希望在django视图中执行相同的操作(即获得相同的结果)。我有点像

all_exercise_finish_count = Exercise_state.objects.filter(exercise_id=1, intensity_level=7).count()
如何在这个django视图中反映相同的内容?

更新 完全改变了我的答案,因为随后在评论中的讨论清楚地表明,老年退休金计划的意图与最初看起来的大不相同

您可以通过以下方式找到在强度7下完成所有7项练习的用户

from django.db.models.import Count

Exercise_state.objects.annotate(
    c = Count('exercise').filter(c=7, exercise_id= 7)
答案的第一种形式如下:

原始查询可以使用

expr在最小值和最大值之间

如果expr大于或等于min且expr小于或等于 到max,在返回1之间,否则返回0。这相当于
到表达式(最简单的是:
exercise\u id\u range=(1,7)
。不幸的是,最初的查询和回答中的查询给了我不同的结果。我最初的查询给了我“0”,而你的查询给了我“1”!我认为它考虑了强度级别为7的1到7之间的任何练习id,而不是强度级别为7的1到7之间的所有练习id。不,我的原始sql查询与你的原始sql查询。所有这些额外的and都被重新定义。我认为我应该重新定义我的最终需求:我想检索满足练习id=1对应强度等级=7的用户id的计数,依此类推,直到7。简言之,在所有练习中达到强度等级=7的用户。这是一个更复杂的查询。请upda请用此信息回答您的问题,不要忘记发布您的django模型。用户可以使用
intensity\u level=7
进行多次练习吗?可以,但这并不重要,因为在intensity\u level=7之后不会记录其进度
select count(user_id) from demo_exercise_state where 
exercise_id BETWEEN 1 and 7 AND intensity_level=7
all_exercise_finish_count = Exercise_state.objects.filter(exercise_id__gte=1, intensity_level=7, excercise_id__lte=7).count()