当前位置: 首页 > 知识库问答 >
问题:

Django视图代码有奇怪的行为

颛孙天宇
2023-03-14

我写了这个Django视图方法:

def list_all_devices(request):

    all_devices_info = []
    fields = Devices.objects.all()
    for field in fields:
        device = Devices.objects.filter(device_id=field.device_id).values()
        dev = device[0]

        dev['variables'] = Variables.objects.filter(device_id=field.device_id).values()

        del dev['device_creation_datetime']
        all_devices_info.append(dev)

    return HttpResponse(json.dumps(all_devices_info), content_type="application/json")

出于某种原因,第一个代码不起作用,但是如果我做了如下的小修改,它就会开始工作,我不知道为什么。

def list_all_devices(request):

    all_devices_info = []
    fields = Devices.objects.all()
    for field in fields:
        device = Devices.objects.filter(device_id=field.device_id).values()
        dev = device[0]

        dev['variables'] = [v for v in Variables.objects.filter(device_id=field.device_id).values()]

        del dev['device_creation_datetime']
        all_devices_info.append(dev)

    return HttpResponse(json.dumps(all_devices_info), content_type="application/json")

当我分析修改时:

[v for v in Variables.objects.filter(device_id=field.device_id).values()]

Variables.objects.filter(device_id=field.device_id).values()

它们看起来很相似,而且都是列表,里面有相同的信息。但是,当对其调用< code>json.dumps方法时,在第一段代码中,它会在浏览器上引发以下错误。

共有2个答案

司寇安宜
2023-03-14

value()不返回简单的数据类型。

我尝试了django模型:

dir(myModel.objects.all().values())

[“和”,“布尔”,“类”,“深度复制”,“删除”,“字典”,“文档”,“格式”,“获取属性”,“获取项”,“获取状态”,“哈希”,“初始化”,“iter”,“len”,“模块”,“新”,“非零”,“或”,“减少”,“reduce_ex”,“repr”,“setattr”,“setattr”,“setstate”,“sizeof”,“str”,“子类钩子”,“弱引用”,“_add_hints”,“_as_sql”,“_base_queryset_class”,“_batched_insert”,“_clone”,“_create_object_from_params”,“_db”,“_earliest_or_latest”,“_extract_model_params”,“_fetch_all”,“_fields”,“_filter_or_exclude”, “_for_write”、“_has_filters”、“_hints”、“_insert”、“_known_related_objects”、“_merge_known_related_objects”、“_merge_sanity_check”、“_next_is_sticky”、“_populate_pk_values”、“_prefetch_done”、“_prefetch_related_lookups”、“_prefetch_related_objects”、“_prepare”、“_raw_delete”、“_result_cache”、“_setup_aggregate_query”、“_setup_query”、“_specialized_queryset_class”、“_sticky_filter”、“_update”、“汇总”、“全部”、“注释”、“annotation_names”、“as_manager”、“bulk_create”、“complex_filter”、“计数”、“创建”、“日期”、“日期时间”、“db”、“延迟”、“删除”、“不同”、“最早”、“排除”、“存在”、“额外”、“extra_names”、“field_names”、“过滤器”、“第一”、“获取”、“get_or_create”、“in_bulk”、“is_compatible_query_object_type”、“迭代器”、“最后”、“最新”、“模型”、“无”、“仅”、“order_by”、“有序”、“prefetch_related”、“查询”、“原始”、“反向”、“select_for_update”、“select_related”、“更新”、“update_or_create”、“使用”、“value_annotation”、“value_annotation”、“, “价值观”、“values_list”]

这是python数组的目录:

dir([])

[“添加”、“类”、“包含”、“删除”、“删除”、“删除”、“文档”、“eq”、“格式”、“ge”、“getattribute”、“getitem”、“getitem”、“getlice”、“gt”、“哈希”、“iadd”、“imul”、“初始化”、“iter”、“le”、“len”、“lt”、“多”、“ne”、“ne”、“new”、“reduce”、“reduce_ex”、“repr”、“反转”、“反转”、“设置”、“设置”、“设置”、“设置”、“大小”、“大小”、“斯特里”、“子类”、“附加”、“计数”、“扩展”、“索引”、“插入”、“流行”、“删除”、“反向”、“排序”]

傅边浩
2023-03-14

Devices.objects.filter(device_id=field.device_id). value()是ValuesQuerySet,它派生自QuerySet,然后两者都是未评估的,这意味着这是一个查询,但在您应用列表或迭代它之前不会在数据库上执行。当您使用json.dumps时,您需要的是数据而不是查询。

应用以下内容查看类型:

Devices.objects.filter(device_id=field.device_id).values().__class__

django . db . models . query . values queryset

Devices.objects.filter(device_id=field.device_id).values().__class__.__base__

django.db.models.query.QuerySet

 类似资料:
  • 我在登录测试方法中面临奇怪的执行行为。我在selenium网格下运行这段代码。网格配置为独立服务器。因此,首先,我使用批处理文件启动selenium网格(Hub\Node)以通过测试执行。 代码:1. pojDataSource.java: clsConstant。java: 模块测试。java: 当我在Eclipse IDE中以调试模式执行代码时,它向我显示了奇怪的行为。首先,它启动浏览器并打开

  • 问题内容: 所有! 我在LinkedBlockingQueue中发现了奇怪的代码: 谁能解释为什么我们需要局部变量h?它对GC有什么帮助? 问题答案: 为了更好地了解发生了什么,让我们看看执行代码后列表的样子。首先考虑一个初始列表: 然后指向和指向: 然后指向和指向: 现在,实际上我们知道只有一个指向第一个元素的活动引用,它本身就是(),并且我们还知道GC收集的对象不再具有活动引用,所以当方法结束

  • 问题内容: 我使用jsoup从不同页面的html源代码中提取了一些信息。它们大多数是UTF-8编码的。其中之一是使用ISO-8859-1编码的,这会导致一个奇怪的错误(在我看来)。 包含错误的页面是:http : //www.gudi.ch/armbanduhr- metall- wasserdicht-1280x960-megapixels-p-560.html 我用以下代码阅读了所需的Stri

  • 我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方

  • 问题内容: 我在GregorianCalendar类中遇到一个奇怪的行为,我想知道我是否真的做得不好。 仅当初始化日期的月份的实际Maximum大于我将日历设置为的月份时,才追加此值。 这是示例代码: 我知道问题是由于日历初始化日期是31天(可能是5月),与设置为2月(28天)的月份混淆了。修复很容易(只需在设置年和月之前将day_of_month设置为1),但是我想知道这确实是想要的行为。有什么

  • 问题内容: 我正在为一个问题而苦苦挣扎,我不明白为什么它不起作用。如何通过将变量传递并转换为? 为什么在顶部代码段中不起作用,但在行下方的底部代码段中起作用? 唯一的区别似乎是添加了一个额外的变量,该变量也被键入为? 问题答案: 该是一种原始类型,同时是一个普通的Java类。您不能在原始类型上调用方法。但是该方法在上可用,如javadoc中所示 有关这些原始类型的更多信息,请参见此处