我想知道是否有更短的方法来更新整个对象,
假设我有一个这样声明的对象“ Package”:
class Package(db.Model):
__searchable__ = ['name','version','maintainer','uploaders']
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(80))
version = db.Column(db.String(15))
architecture = db.Column(db.String(255))
maintainer = db.Column(db.String(255))
sha256 = db.Column(db.String(200))
sha1 = db.Column(db.String(50))
md5sum = db.Column(db.String(50))
depends = relationship('Package',
secondary=package_to_package,
primaryjoin=id==package_to_package.c.left_package_id,
secondaryjoin=id==package_to_package.c.right_package_id,
backref='neededBy')
recommends = relationship('Package',
secondary=package_recommended,
primaryjoin=id==package_recommended.c.left_package_id,
secondaryjoin=id==package_recommended.c.right_package_id,
backref='recommendedBy')
lastUpdate = db.Column(db.DateTime)
distributionId = db.Column(db.Integer,db.ForeignKey('distribution.id'))
componentId = db.Column(db.Integer,db.ForeignKey('component.id'))
status = db.Column(db.String(50))
format = db.Column(db.String(25))
uploaders = db.Column(db.String(255))
def __init__(self,name):
self.name = name
self.lastUpdate = datetime.utcnow()
def __repr__(self):
return '<Package : %r Version : %r Maintainer : %r componentId : %d >' % (
self.name,
self.version,
self.maintainer,
self.componentId)
我有一个更新这些对象的芹菜任务,我更新该对象的第一种方法是:
if isinstance(package, Package):
# Check if Distribution already Exists
recordedPackage = Package.query.filter_by(name=package.name,
distributionId=package.distributionId,
componentId=package.componentId).first()
app.logger.debug("Does it already Exists ?")
if recordedPackage is None:
package.depends = packagesNeeded
db.session.add(package)
elif isinstance(recordedPackage,Package) :
app.logger.info("updating %r"%(recordedPackage))
recordedPackage = package
db.session.commit()
这种方法不会更新任何内容,因此我必须这样做:
elif isinstance(recordedPackage,Package) :
app.logger.info("updating %r"%(recordedPackage))
recordedPackage.version = package.version
recordedPackage.depends = packagesNeeded
recordedPackage.maintainer = package.maintainer
recordedPackage.md5sum = package.md5sum
recordedPackage.sha1 = package.sha1
recordedPackage.sha256 = package.sha256
recordedPackage.lastUpdate = datetime.utcnow()
[...]
db.session.commit()
这样做确实是动态的或干净的。
有没有办法更新整个对象(当然没有ID)?
谢谢你的遮阳篷
最后,我将dir方法与getattr / setattr结合使用,
以update
在GG_Python建议的类中实现一个方法,该方法
的确如下所示:
def update(self,newPackage):
newPackageAttributes = [a for a in dir(newPackage) if not a.startswith('__')]
for key in newPackageAttributes:
try:
if getattr(self,key) != getattr(newPackage, key) \
and key != 'id'\
and key != 'name':
if type(getattr(newPackage, key)) == str:
setattr(self,key,getattr(newPackage, key))
except AttributeError:
app.logger.debug("attribute not found, no pb")
self.lastUpdate = datetime.utcnow()
这样,我不更新InstanceState等,
我可以稍后再添加一些检查(例如名称应相同,等等...)
,这在解析包的方法上给了我类似的东西:
recordedPackage = Package.query.filter_by(name=package.name,
distributionId=package.distributionId,
componentId=package.componentId).first()
app.logger.debug("Does it already Exists ?")
if recordedPackage is None:
package.depends = packagesNeeded
db.session.add(package)
elif isinstance(recordedPackage,Package) :
app.logger.info("updating %r"%(recordedPackage))
recordedPackage.update(package)
db.session.commit()
谢谢您的建议
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句