簡體   English   中英

如何在flask sqlachemy中添加多列並作為單列返回

[英]How to add multiple columns in flask sqlachemy and return it as a single column

我正在嘗試創建一個數據庫 model,其中的列是其他列的驅動列,因此在這種情況下,它是一個薪資系統,其中 total_benfits 是一個列,它是添加具有總收益的其他列的結果

from flask_login import UserMixin
from datetime import datetime
from app import db

class Payroll(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    firstname = db.Column(db.String(500),unique=False, nullable=False)
    lastname = db.Column(db.String(500),unique=False, nullable=False)
    email = db.Column(db.String(500),unique=True, nullable=False)
    id_number = db.Column(db.String(500),unique=True, nullable=False)
    bank_details = db.Column(db.String(500),unique=True, nullable=False)
    retainer = db.Column(db.Float, unique=False, nullable=False)
    discretionary_allowance = db.Column(db.Float, unique=False, nullable=True)
    weekly_incentives = db.Column(db.Float, unique=False, nullable=True) 
    overtime = db.Column(db.Float, unique=False, nullable=True) 
    coupons_value = db.Column(db.Float, unique=False, nullable=True)
    performance_incentives = db.Column(db.Float, unique=False, nullable=True)
    anniversary_payout = db.Column(db.Float, unique=False, nullable=True)
    shift_allowance = db.Column(db.Float, unique=False, nullable=True)
    back_pay = db.Column(db.Fl`your text`oat, unique=False, nullable=True)
    agent_benefits = db.Column(db.Float, unique=False, nullable=True)
    total_earnings = db.column_property(retainer + discretionary_allowance + weekly_incentives + overtime + coupons_value + performance_incentives + anniversary_payout + shift_allowance +back_pay + agent_benefits, db.Float)
    medical_aid = db.Column(db.Float, unique=False, nullable=True)
    nssa = db.Column(db.Float, unique=False, nullable=True)
    canteen = db.Column(db.Float, unique=False, nullable=True)
    cicm = db.Column(db.Float, unique=False, nullable=True)
    zol = db.Column(db.Float, unique=False, nullable=True)
    withholding_tax = db.Column(db.Float, unique=False, nullable=True)
    medical_loan = db.Column(db.Float, unique=False, nullable=True)
    staff_Loan = db.Column(db.Float, unique=False, nullable=True)
    independent_contractors_deduction = db.Column(db.Float, unique=False, nullable=True)
    fixed_deductions = db.Column(db.Float, unique=False, nullable=True)
    fixed_deductions_months = db.Column(db.Integer, unique=False, nullable=True)
    total_fixed_deductions = db.column_property(fixed_deductions * fixed_deductions_months, db.Float)
    total_deductions = db.column_property(medical_aid + nssa + canteen + cicm + zol + withholding_tax + medical_loan + staff_Loan + independent_contractors_deduction + total_fixed_deductions, db.Float)
    net_Pay = db.column_property(total_earnings - total_deductions, db.Float)
    
    def __repr__(self):
        return f"Net Salary for ('{self.firstname}','{self.lastname}','is','{self.net_Pay}')" 

但我收到以下錯誤:

net_Pay = db.column_property(total_earnings - total_deductions, db.Float)
                                 ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
TypeError: unsupported operand type(s) for -: 'ColumnProperty' and 'ColumnProperty'

使用column_property()方法時,你的屬性所在的model class 必須和SELECT表達式兼容。 相反,您可以使用 SQLAlchemy 中的SQLAlchemy hybrid_property()方法。 您可以在此處找到詳細信息。

from flask_login import UserMixin
from datetime import datetime
from app import db
from sqlalchemy.ext.hybrid import hybrid_property

class Payroll(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    firstname = db.Column(db.String(500),unique=False, nullable=False)
    lastname = db.Column(db.String(500),unique=False, nullable=False)
    email = db.Column(db.String(500),unique=True, nullable=False)
    id_number = db.Column(db.String(500),unique=True, nullable=False)
    bank_details = db.Column(db.String(500),unique=True, nullable=False)
    retainer = db.Column(db.Float, unique=False, nullable=False)
    discretionary_allowance = db.Column(db.Float, unique=False, nullable=True)
    weekly_incentives = db.Column(db.Float, unique=False, nullable=True) 
    overtime = db.Column(db.Float, unique=False, nullable=True) 
    coupons_value = db.Column(db.Float, unique=False, nullable=True)
    performance_incentives = db.Column(db.Float, unique=False, nullable=True)
    anniversary_payout = db.Column(db.Float, unique=False, nullable=True)
    shift_allowance = db.Column(db.Float, unique=False, nullable=True)
    back_pay = db.Column(db.Fl`your text`oat, unique=False, nullable=True)
    agent_benefits = db.Column(db.Float, unique=False, nullable=True)
    medical_aid = db.Column(db.Float, unique=False, nullable=True)
    nssa = db.Column(db.Float, unique=False, nullable=True)
    canteen = db.Column(db.Float, unique=False, nullable=True)
    cicm = db.Column(db.Float, unique=False, nullable=True)
    zol = db.Column(db.Float, unique=False, nullable=True)
    withholding_tax = db.Column(db.Float, unique=False, nullable=True)
    medical_loan = db.Column(db.Float, unique=False, nullable=True)
    staff_Loan = db.Column(db.Float, unique=False, nullable=True)
    independent_contractors_deduction = db.Column(db.Float, unique=False, nullable=True)
    fixed_deductions = db.Column(db.Float, unique=False, nullable=True)
    fixed_deductions_months = db.Column(db.Integer, unique=False, nullable=True)
    
    def __repr__(self):
        return f"Net Salary for ('{self.firstname}','{self.lastname}','is','{self.net_Pay}')"

    @hybrid_property
    def total_earnings(self):
        return self.retainer + self.discretionary_allowance + self.weekly_incentives + self.overtime + self.coupons_value + self.performance_incentives + self.anniversary_payout + self.shift_allowance + self.back_pay + self.agent_benefits

    @hybrid_property
    def total_fixed_deductions(self):
        return self.fixed_deductions * self.fixed_deductions_months

    @hybrid_property
    def total_deductions(self): 
        return self.medical_aid + self.nssa + self.canteen + self.cicm + self.zol + self.withholding_tax + self.medical_loan + self.staff_Loan + self.independent_contractors_deduction + self.total_fixed_deductions

    @hybrid_property
    def net_Pay(self): 
        return self.total_earnings - self.total_deductions

因此,您希望對Payroll實例進行的計算在 Python 中執行。

對於Payroll實例,您可以通過以下方式訪問total_earnings屬性:

payroll.total_earnings

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM