开发者社区> 问答> 正文

我在Django视图中只得到for循环的第一个结果

我在一个模型中有一个PositiveIntegerField,在这个模型中,我需要遍历该模型来检查这个字段的所有值,并将其结果用于我的视图中。 问题是,当我这样做时,我只得到数据库中第一行的值! models.py

class RoomType(models.Model):
    hotel = models.ForeignKey(Hotel, on_delete=models.CASCADE)
    room_type = models.ForeignKey(RoomTypesNames, on_delete=models.CASCADE)
    room_capacity = models.PositiveIntegerField() ## Thats the field i wanna check its value

views.py

def SearchHotels(request):
    x = None
    z = None
    t = None

    if request.method == 'GET':
        destination = request.GET.get('cityHotels')
        numAdultStr = request.GET.get('numAdult')
        numChild = request.GET.get('numChild')
        numAdult = int(numAdultStr)

        if destination:
            q_city2 = Q(hotel__city__name__icontains = destination)
            rooms2  = RoomType.objects.filter(q_city2)
      ################################
      ### next is my question:
            if rooms2:
                for r in rooms2:
                    if r.room_capacity < numAdult and numAdult % r.room_capacity == 0:
                        x = numAdult / r.room_capacity

### i want to loop through this query and check the values of 'room_capacity' in all models, but i only get the result of only the first row in my database

问题来源StackOverflow 地址:/questions/59386272/i-got-the-first-result-only-of-the-for-loop-in-django-views

展开
收起
kun坤 2019-12-25 22:06:10 545 0
1 条回答
写回答
取消 提交回答
  • 可能您应该获得表的最后一个条目,除非您的order_by被反转。正如@furas在注释中提到的,当您在循环中处理多个条目时,最好将计算值添加到列表中。 但是另一种解决方案是使用带条件表达式的注释来使用DB为您计算值:

    from django.db.models import FloatField, IntegerField, ExpressionWrapper, F, Case, When, Value
    
    room2 = RoomType.objects.filter(q_city2).annotate(
        x_modulo=ExpressionWrapper(
                numAdult % F('room_capacity'),
                output_field=IntegerField()
             )
        ).annotate(
            x=Case(
                When(
                    room_capacity__lt=numAdult,
                    x_modulo=0,
                    then=numAdult/F('room_capacity')
                ),
                default_value=Value('0'),
                output_field=FloatField()
            )
        )
    all_x = []
    for r in room2:
        all_x.append(r.x)
    print(all_x)
    # or
    print(room2.values('x'))
    
    # filter usage
    room2.filter(x__gt=0)
    

    说明:这里我标注的x_modulo是numAdult和room_capacity的模值。然后我在注释x的值,检查房间容量是否小于成人人数,x_modulo的值是否为0。然后我只是在标注numAdults和room_capacity的比例。

    2019-12-25 22:06:16
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载