Flask Restplus返回列连接查询

问题描述 投票:1回答:1

我有两个相互关联的模型。我想在两个模型之间建立内部联接并将其返回到特定路径中。问题是光盘只接受单个模型的列。抱歉写不好。我想要所有的Fields by ProcedureType.id,类似SELECT pt.name,pt.description,f。* FROM proceduretype pt INNER JOIN field f ON pt.id = f.procedure_type_id WHERE pt.id = 1.我附上代码。

Model 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.朋友

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"
    }
  ]
}

谢谢你的帮助

python-3.x flask-sqlalchemy dto flask-restplus
1个回答
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')
© www.soinside.com 2019 - 2024. All rights reserved.