Flask炼金术更新整个对象

2024-10-01 09:35:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道是否有一种更短的方法来更新整个对象,
假设我有一个声明如下的对象“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)

我有一个芹菜任务来更新这些对象, 我更新此对象的第一个方法是:

^{pr2}$

这种方法不会更新任何内容,所以我必须这样做:

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)?
谢谢你的雨篷


Tags: 对象方法nameselfidpackagedbstring
2条回答

使用update方法;我通常创建一个字典以使内容可读:

dct = {"version": package.version, ... , "lastUpdate":datetime.utcnow()}
recordedPackage.update(dct)
db.session.commit()

请注意,即使在add之后也需要提交,因此请考虑将commit语句移到if/elif条件之外。在

最后,我将dir方法与getattr/setattr一起使用
在类中实现一个update方法,如GG\ 看起来像这样:

 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等了,
我可以在以后添加一些检查(例如名称应该相同等等)
在解析包的方法上给了我这样的信息:

^{pr2}$

谢谢你的建议

相关问题 更多 >