ai didi

python - 更改association_proxy中引用的集合类键

转载 作者:太空宇宙 更新时间:2023-11-03 19:16:25 24 4
gpt4 key购买 nike

是否可以更改关联代理中引用的集合类的键?

示例:

class Event(ManagerBase):
"""Defines an event."""

__tablename__ = 'eventing_events'

id = Column(Integer, primary_key=True)
device_id = Column(Integer, ForeignKey(EventingDevice.id), nullable=False)
device = relation(EventingDevice)
type_id = Column(Integer, ForeignKey(EventType.id), nullable=False)
type = relation(EventType)
datetime = Column(DateTime, nullable=False)
summary = Column(String(500))

fields = association_proxy("field_values", "value")

class EventFieldValue(ManagerBase):
"""The value of a single field of an event."""

__tablename__ = 'eventing_event_field_values'

event_id = Column(Integer, ForeignKey(Event.id), primary_key=True)
event = relation(Event, backref=backref("field_values",
collection_class=attribute_mapped_collection("field")))
field_id = Column(Integer, ForeignKey(Field.id), primary_key=True)
field = relation(Field)
value = Column(Text)

在这种情况下,Eventfield 属性将表示一个以 EventFieldValue.field 作为键的字典。是否可以仅在代理本身中更改此 key 而不影响关系?

最佳答案

这对于原始的 SQLAlchemy 来说似乎是不可能的 AssociationProxy ,由于类直接访问原始关系,因此任何键都将在底层关系上进行 1:1 查询。

我写了一个类DictProxy ,它允许更改键和值字段:

class DictProxy(object):
def __init__(self, col, keyattr, valattr = None):
self.obj = None
self.col = col
self.keyattr = keyattr
self.valattr = valattr

def __get__(self, obj, class_):
self.obj = obj
return self

def __repr__(self):
outdict = {}
for k, v in getattr(self.obj, self.col).iteritems():
if not k is None:
if self.valattr == None:
outdict[getattr(k, self.keyattr)] = v
elif v is not None:
outdict[getattr(k, self.keyattr)] = getattr(v, self.valattr)
else:
outdict[getattr(k, self.keyattr)] = None
return repr(outdict)

def __getitem__(self, key):
keyobj = [obj for obj in getattr(self.obj, self.col) if getattr(obj, self.keyattr) == key]
if not len(keyobj):
return None
if self.valattr == None:
return getattr(self.obj, self.col)[keyobj[0]]
else:
return getattr(getattr(self.obj, self.col)[keyobj[0]], self.valattr)

def __contains__(self, key):
return len([obj for obj in getattr(self.obj, self.col) if getattr(obj, self.keyattr) == key]) != 0

def dict_proxy(*arg):
return DictProxy(*arg)

用法示例:

class Event(ManagerBase):
"""Defines an event."""

__tablename__ = 'eventing_events'

id = Column(Integer, primary_key=True)
device_id = Column(Integer, ForeignKey(EventingDevice.id), nullable=False)
device = relation(EventingDevice)
type_id = Column(Integer, ForeignKey(EventType.id), nullable=False)
type = relation(EventType)
datetime = Column(DateTime, nullable=False)
summary = Column(String(500))

fields = dict_proxy("field_values", "name", "value")

fieldsEvent现在是一本字典 EventFieldValue.name作为键并访问关系 field_values(通过 EventFieldValuebackref 进入)。

注意:实际上,这是一个只读代理,但可能(尽管很棘手)通过 __setitem__ 扩展代理。方法。

关于python - 更改association_proxy中引用的集合类键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11212882/

24 4 0
文章推荐: C# System.Data.OleDb.OleDbException 异常
文章推荐: python - 重写 __new__ 的基元类生成带有错误 __module__ 的类
文章推荐: Python sendall() 与 C write()
文章推荐: matlab - 如何测试行是否在矩阵中?
太空宇宙
个人简介

我是一名优秀的程序员,十分优秀!

滴滴打车优惠券免费领取
滴滴打车优惠券
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com