猿问

访问sqlalchemy中没有key的json

我有一列“ value ”,类型为 postgres ' JSON '。列中的示例数据。

  1. “显示名称1”

  2. {“middleName”:“其他”}

  3. [{"primary": true, "type": "work", "value": "rusr@r.com"}, {"primary": true, "type": "work", "value": "iu @n.com"}]

我知道我可以使用这样的键值对访问 json,

.filter(Values.value['middleName'].astext=='other')(值为型号名称)

问题是如何访问字符串值或对象数组。

我试过,

.filter(Values.value.astext=='displayname1') 它给了我AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object associated with Values.value has an attribute 'astext'

.filter(Values.value['type'].astext=='work')- 在这里我尝试过滤数组中的“type”:“work”对象。你怎么做到这一点。是否可以在不指定索引的情况下搜索所有对象。

我使用 postgres 作为后端数据库。

楷模 -

class Values(db.Model):

    __tablename__ = 'attribute_values'

                    

    id = db.Column(db.Integer, primary_key=True)

    attribute = db.Column(db.Integer, ForeignKey('attributes.id'), primary_key=True)

    value = db.Column(JSON)

class Attributes(db.Model):

    __tablename__ = 'attributes'


    id = db.Column(db.Integer, primary_key=True)

    name = db.Column(db.Text)


   user_attribute = db.relationship(Values, backref='attributes', primaryjoin=id == Values.attribute)

查询我正在尝试 -


db.session.query(Values).join(Attributes, Values.attribute == Attributes.id).filter("what filters that i should be using for the cases mentioned above").all()


慕桂英4014372
浏览 148回答 3
3回答

饮歌长啸

如果有人仍在寻找答案,这就是它的完成方法(cast(Values.value, db.String())=='"Employee"'))以上是存储在 JSONB 列中的字符串。请注意该过滤器中使用的引号。(Values.value.contains([{"type":"examplecom"}]))这个用于在 JSONB 列中搜索 JSON 数组

互换的青春

假设json对象是一个字符串,使用json.loads将其转换为字典,然后正常索引。>>> import json>>> s = """[{"primary": true, "type": "work", "value": "rusr@r.com"}, {"primary": true, "type": "work", "value": "iu@n.com"}]""">>> my_dict = json.loads(s)>>> my_dict[0]['type']'work'然后,您可以使用以下列表理解来搜索 type == 起作用的任何行。>>> search = [i for i in my_dict if i['type'] == 'work']>>> search[{'primary': True, 'type': 'work', 'value': 'rusr@r.com'}, {'primary': True, 'type': 'work', 'value': 'iu@n.com'}]这是一个不使用列表理解的相同事物的示例。>>> search = list()>>> for i in my_dict:...     if i['type'] == 'work':...             search.append(i)...>>> search[{'primary': True, 'type': 'work', 'value': 'rusr@r.com'}, {'primary': True, 'type': 'work', 'value': 'iu@n.com'}]

慕姐4208626

我无法测试代码,但你可以尝试一下。l = .filter(User_Values.value)s = [[x for x in i if x['type'].astext=='work'] for i in l if isinstance(i, list)]如果可以向我提供创建表的代码,我可以进行测试以提供更好的答案。如果这不是您想要的,请提前抱歉。
随时随地看视频慕课网APP

相关分类

Python
我要回答