Вопрос

How can I sort or return a list of my projects based upon the sum of driver.factor times project_driver.value for each driver per project? So there should be an additional calculated/dynamic field/column "rating" in project.

For example:

project1.rating = (10.0 * 0.7) + (40.0 * 0.2) + (20.0 * 0.1)

Thank you

models:

class ProjectDriver(db.Model):
    project_id = db.Column(db.Integer, db.ForeignKey('project.id'),
        primary_key=True)
    driver_id = db.Column(db.Integer, db.ForeignKey('driver.id'),
        primary_key=True)
    value = db.Column(db.Float)
    driver = db.relationship('Driver', backref=db.backref('project_drivers'))

    def __init__(self, value, driver):
        self.value = value
        self.driver = driver

    def __repr__(self):
        return '<ProjectDriver %r, %r>' % (self.project_id, self.driver_id)

class Project(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(120))
    project_drivers = db.relationship('ProjectDriver',
        backref=db.backref('projects'))

    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return '<Project %r>' % self.name

class Driver(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(120))
    factor = db.Column(db.Float)

    def __init__(self, name, factor):
        self.name = name
        self.factor = factor

    def __repr__(self):
        return '<Driver %r>' % self.name

views:

@app.route('/projects')
def list_view():
    projects = Project.query.all()
    return render_template('list_view.html', projects=projects)

sqlite:

sqlite> select * from project;
id          name      
----------  ----------
1           Project1  
2           Project2  
3           Project3  
sqlite> select * from driver;
id          name        factor    
----------  ----------  ----------
1           Driver1     0.7       
2           Driver2     0.2       
3           Driver3     0.1       
sqlite> select * from project_driver;
project_id  driver_id   value     
----------  ----------  ----------
1           1           10.0      
1           2           40.0      
1           3           20.0      
2           1           20.0      
2           2           10.0      
2           3           30.0      
3           1           50.0      
3           2           20.0      
3           3           10.0
Это было полезно?

Решение

Take a look at hybrid properties. In your project driver class something like:

@hybrid_property
def rating(self):
    return self.factor * self.driver.factor

Then do the addition calculation in projects

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top