Flask Restplus返回列联接查询

时间:2018-09-17 06:06:34

标签: python-3.x flask-sqlalchemy dto flask-restplus

我有两个相互关联的模型。我想在两个模型之间建立内部联接,并在特定路径中返回它。问题在于光盘仅接受单个模型的列。对不起,写作不好。我想要由 ProcedureType.id 提供的所有 Fields ,例如 SELECT pt.name,pt.description,f。* FROM proceduretype pt INNER JOIN字段f ON pt。 id = f.procedure_type_id WHERE pt.id = 1 。我附上代码。

模型ProcedureType

class ProcedureType(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    dependence_id = db.Column(db.Integer)
    name = db.Column(db.String(100))
    description = db.Column(db.String(500))
    requirements = db.Column(db.String(500))
    online = db.Column(db.Boolean, default=False)

    def __init__(self, dependence_id, name, description, requirements, online):
        self.dependence_id = dependence_id
        self.name = name
        self.description = description
        self.requirements = requirements
        self.online = online

模型字段

class Field(db.Model):
    id = db.Column(db.BigInteger, primary_key=True, autoincrement=True)
    procedure_type_id = db.Column(db.Integer, db.ForeignKey(
        ProcedureType.id), nullable=False)
    name = db.Column(db.String(50), nullable=False, unique=True)
    label = db.Column(db.String(100))
    type = db.Column(db.String(100))
    default_value = db.Column(db.String(100))
    validations = db.Column(db.JSON)

    def __init__(self, procedure_type_id, name, label, type, default_value, validations):
        self.procedure_type_id = procedure_type_id
        self.name = name
        self.label = label
        self.type = type
        self.default_value = default_value
        self.validations = validations

service.py

def prueba_inner_join(id):
    return db.session.query(Field).join(ProcedureType).filter_by(id=id)

控制器

from flask import request
from flask_restplus import Resource

from .dto import ProcedureTypeDto, FieldDto
from . import service

field_ns = FieldDto.api
_field = FieldDto.field_procedure
@field_ns.route('/<id>')
class FieldList(Resource):
    @field_ns.doc('procedure_type')
    @field_ns.marshal_list_with(_field)
    def get(self, id):
        """List all procedure types"""
        return service.get_fields_procedure(id)

DTO

class FieldDto:
    api = Namespace('field', description='Field related operations')
    field_procedure = api.model('field_details', {
        'id': fields.Integer(readonly=True, description='The unique identifier'),
        'procedure_type_id': fields.String(required=True, description='Procedure type Id'),
        'name': fields.String(required=True, description='name'),
        'label': fields.String(required=True, description='label'),
        'type': fields.String(required=True, description='Input type'),
        'default_value': fields.String(required=True, description='Default value'),
        'validations': fields.String(required=True, description='validations'),
    })

例如,我想将所有内容都归还到我可以根据自己喜好整理的json中

{
  "procedure_name": "NAME PROCEDURE TYPE",
  "description": "DESCRIPTION PROCEDURE TYPE",
  "fields":[{
        "type": "text",
        "name": "name_field",
        "id": 2,
        "validations": "{'required':true}",
        "default_value": "",
        "label": "LABEL 2",
        "procedure_type_id": "1"
    },
    {
        "type": "text",
        "name": "name_field",
        "id": 2,
        "validations": "{'required':true}",
        "default_value": "",
        "label": "LABEL 2",
        "procedure_type_id": "1"
    }
  ]
}

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

您需要另一个模型,该模型会将field_procedure作为嵌套列表包括在内

class FieldDto:
    api = Namespace(...)
    field = api.model('field_details', ...)
    procedure = api.model('procedure', {
        'procedure_name': fields.String(...),
        'description': fields.String(...),
        'fields': fields.List(fields.Nested(field)),
    }

我还注意到您在模型之间没有定义relationship

将以下内容添加到ProcedureType类中,以便您可以在fields实例上引用ProcedureType属性。

fields = db.relationship('Field')