Flask Restplus возвращает запрос на соединение столбцов - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть две модели, которые относятся друг к другу. Я хочу сделать внутреннее соединение между двумя моделями и вернуть его по определенному пути. Проблема в том, что диск принимает только столбцы одной модели. Извините за плохое написание. Я хочу, чтобы все Поля от ПроцедураType.id , что-то вроде SELECT pt.name, pt.description, f. * ОТ процедуры typetype pt INNER JOIN field f ON f.procedure_type_id WHERE pt.id = 1 . Я прилагаю код.

Модель времени процедуры

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 голосов
/ 17 сентября 2018

Вам нужна другая модель, которая будет включать ваш 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...