Как принять None для поля целочисленного типа - PullRequest
0 голосов
/ 01 июля 2019

У меня есть конечная точка для обновления модели компании, одним из полей является «post_box», которое является целым числом, это необязательный параметр, который по умолчанию равен нулю.Все идет нормально.Но мне нужно иметь возможность установить значение NULL, чтобы пользователь мог удалить любое значение, которое может иметь post_box.Интерфейс отправляет post_box: None, если он пуст в поле ввода номера, которое я использую для этого.Ответ: {post_box: «Ни один не имеет тип« целое число »»}

Я знаю, что Ни один не является целым числом, как мне сделать это правильно?

Модель компании

class Company(db.Model):
    """ Company Model for storing company related details """
    __tablename__ = "company"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    public_id = db.Column(db.String(100), unique=True)
    company_name = db.Column(db.String(255), unique=True, nullable=False)
    organisation_number = db.Column(db.BigInteger, unique=True)
    street_name = db.Column(db.String(255), unique=False, nullable=False)
    post_code = db.Column(db.Integer, unique=False, nullable=False)
    post_area = db.Column(db.String(20), unique=False, nullable=False)
    post_box = db.Column(db.Integer, unique=False, nullable=True, default=None)
    longitude = db.Column(db.String(30), unique=False, nullable=True, default=None)
    latitude = db.Column(db.String(30), unique=False, nullable=True, default=None)
    registered_on = db.Column(db.DateTime, nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    customers = db.relationship("Customer", cascade="all,delete")
    projects = db.relationship("Project", cascade="all,delete")

    def __repr__(self):
        return "<Name '{}'>".format(self.company_name).encode('utf-8')

Метод для спасения компании

def save_new_company(data):
    company = Company.query.filter_by(organisation_number=data['organisation_number']).first()
    if not company:
        user = User.query.filter_by(public_id=data['user_public_id']).one()
        new_company = Company(
            public_id=str(uuid.uuid4()),
            company_name=data['company_name'],
            organisation_number=data['organisation_number'],
            street_name=data['street_name'],
            post_code=data['post_code'],
            post_area=data['post_area'],
            registered_on=datetime.datetime.utcnow(),
            user_id=user.id,
        )
        try:
            if data['post_box']:
                new_company.post_box = None
        except KeyError:
            pass
        try:
            if data['longitude']:
                new_company.longitude = data['longitude']
        except KeyError:
            pass
        try:
            if data['latitude']:
                new_company.latitude = data['latitude']
        except KeyError:
            pass

        save_changes(new_company)
        response_object = {
            'status': 'success'
        }
        return response_object, 200

    else:
        response_object = {
            'status': 'fail',
            'message': 'Company already exists.',
        }
        return response_object, 409

Фрагмент из соответствующей части контроллера

@api.expect(_company, validate=True)
    @api.response(201, 'Company successfully created.')
    @api.doc('create a new company')
    def post(self):
        """Creates a new Company """
        data = request.json
        result = save_new_company(data=data)
        return result

И некоторые другие важные вещи:

class CompanyDto:
    api = Namespace('company', description='company related operations')
    company = api.model('company', {
        'public_id': fields.String(description='company public identifier'),
        'company_name': fields.String(required=True, description='Company name'),
        'organisation_number': fields.Integer(required=True, description='Organisation number'),
        'street_name': fields.String(required=True, description='Company street name'),
        'post_code': fields.Integer(required=True, description='Company post code'),
        'post_area': fields.String(required=True, description='Company post area'),
        'post_box': fields.Integer(required=False, nullable=True, default=None, description='Company post box'),
        'longitude': fields.String(required=False, description='Company longitude'),
        'latitude': fields.String(required=False, description='Company latitude'),
        'user_public_id': fields.String(required=True, description='User identifier'),
    })

Возвращенная ошибка:

post_box: «Нет, не имеет тип« целое число »»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...