【问题标题】:Fetching values preceding a given index value in json field获取 json 字段中给定索引值之前的值
【发布时间】:2018-02-02 05:11:01
【问题描述】:

我有 jsonfield

[{"0":"Z","1":"Y","2":"X","3":"W","4":"V"}].

我想获取Y 之前的所有值,即X,W,V ...

i = 0
name = None

obj= Model.objects.get(Name=Request['Name'])
for key in obj:
    currentPosition = key[str(i)]
    i = i +1
    if currentPosition == request['Position']:
        continue
    else:
        sendData.append({"Position": currentPosition})

当我在请求中添加Y 时,它也在获取Z 的详细信息。

【问题讨论】:

  • obj 将是Model 的子类的一个实例(不是实际的Model),并且不会像您的代码所假设的那样可迭代。您需要访问由Model.object.get() 返回的Model 对象中的字段。该 JSON 字段将已经转换为 Python 对象,在本例中是一个以字典作为其唯一元素的列表。

标签: python json django


【解决方案1】:

您可以使用列表推导中的简单比较来获取 "Y" 之前的值:

>>> lst = [{"0":"Z","1":"Y","2":"X","3":"W","4":"V"}]
>>> [v for v in lst[0].values() if v < "Y"]
['X', 'W', 'V']

要在"Y" 的键之前使用 keys 获取值,您可以使用如下内容:

>>> idx = next(int(k) for k, v in lst[0].items() if v == "Y")
>>> [v for k, v in lst[0].items() if int(k) < idx]
['Z']

【讨论】:

    【解决方案2】:

    问题是你正在遍历字典中的每个键,如果它的位置是请求的位置(在这种情况下 '1' 对应于 'Y')然后它会通过条目,并且在所有其他在这种情况下,位置会附加到输出中。您可以做的最小更改是在到达请求的位置时将标志设置为 true,并将 else 替换为 elif。下面给出一个例子:

    i = 0
    none = None
    
    obj = Model.objects.get(Name=Request['Name'])
    flag = False
    for key in obj:
        currentPosition = key[str(i)]
        i = i + 1
        if currentPosition == reques['Position']:
            flag = True
        elif flag:
            sendData.append({"Position" : currentPosition})
    

    但是,上面的代码中有一些小问题,因为我假设 obj 是一个字典。首先,字典中的键没有顺序,为确保您的键已排序,您可以将obj: 替换为sorted(obj):。其次,您有 currentPosition = key[str(i)],我认为这没有任何意义,好像 key 是字典中的一个键,然后 key[str(i)] 将引发异常,因为 key 是一个字符串,因此只有可以被整数索引。

    我相信上述代码的更好版本如下(请注意,如果我的任何假设不正确,请在评论中告诉我,我可以进一步帮助您):

    obj = 模式

    l.objects.get(Name=Request['Name'])
    flag = False
    for key in obj:
        currentPosition = obj[key]
        if currentPosition == request['Position']:
            flag = True
        elif flag:
            sendData.append({'Position' : currentPosition})
    

    【讨论】:

    • 我认为 OP 的意思是按字母顺序排在前面
    • 是的,我刚刚意识到我错过了一点问题的重点,我很快就会修改或删除这个答案。
    猜你喜欢
    • 1970-01-01
    • 2018-07-30
    • 2013-01-01
    • 2019-04-19
    • 1970-01-01
    • 2021-05-25
    • 2017-11-06
    • 1970-01-01
    相关资源
    最近更新 更多