Flask sqlalchemy PUT-запрос, как запросить два динамических идентификатора внешнего ключа из таблицы отношений - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь обновить данные во внешнем интерфейсе, используя React / Redux из запроса PUT в бэкэнде flask / sqlalchemy / postgres.Моя проблема в том, что моя конечная точка может обновляться только по идентификатору, который бесполезен для внешнего интерфейса.Причина в том, что обновляемые данные взяты из класса отношений, который существует только для объединения двух других классов.Что мне нужно сделать, это выяснить, как запросить и вернуть по user_id и country_id, а не по id.Кстати, я тестирую локально с почтальоном.Ниже приведены модели для класса соединения (таблица)

class users_countries_join(db.Model):
    id = db.Column(Integer, autoincrement=True, primary_key=True)
    user_id = db.Column(Integer, ForeignKey(users.id), nullable=False)
    country_id = db.Column(Integer, ForeignKey(countries.id), nullable=False)
    status = db.Column(Integer, nullable=False)
    notes = db.Column(TEXT, nullable=True)
    user = db.relationship('users', backref='user_countries')
    country = db.relationship('countries', backref='travelers')

    def __init__(self, user_id, country_id, status, notes):
        self.user_id = user_id
        self.country_id = country_id
        self.status = status
        self.notes = notes

    def __repr__(self):
        return '<{}>' % self.__name__

Код конечной точки:

@app.route('/api/mapview/<int:user_id>/<int:country_id>/<int:id>', methods=['PUT'])
def update_mapView_data(user_id, country_id, id):
   user_country = users_countries_join.query.get(id)
   user_country.user_id = request.json[‘user_id’]
   user_country.country_id = request.json[‘country_id’]
   user_country.status = request.json[‘status’]
   user_country.notes = request.json[‘notes’]
    db.session.commit()
    return user_country_schema.jsonify(user_country)

Я пытался изменить конечную точку на код ниже, но это не работает.Теоретически, мне нужно такое обновление.Тот, который обновляется путем доступа к данным через user_id и country_id, а не идентификатор класса.Я начинаю думать, что id не нужен для начала.

@app.route('/api/mapview/<int:user_id>/<int:country_id>', methods=['PUT'])
def update_mapView_data(user_id, country_id):
   user_country = users_countries_join.query.get(user_id, country_id)
   user_country.user_id = request.json[‘user_id’]
   user_country.country_id = request.json[‘country_id’]
   user_country.status = request.json[‘status’]
   user_country.notes = request.json[‘notes’]
    db.session.commit()
    return user_country_schema.jsonify(user_country)

Может ли кто-нибудь указать мне правильное направление, как это сделать?Я надеюсь, что просто усложняю это, чем должно быть.

1 Ответ

0 голосов
/ 16 апреля 2019

Вы можете использовать метод filter_by () для фильтрации строк. Например, если вы хотите получить первую user_country, используя user_id и country_id, вы можете использовать следующий запрос:

user_country = users_countries_join.query.filter_by(user_id=user_id, country_id=country_id).first()

Если у вас более одной строки базы данных с одинаковым идентификатором user_id или country_id:

user_country = users_countries_join.query.filter_by(user_id=user_id, country_id=country_id).all()

В вашем примере я предполагаю, что вы хотите получить единственную уникальную строку, чтобы вы могли использовать первый запрос. Кроме того, после изменения значений свойств модели вы должны добавить это изменение в db.session:

db.session.add(user_country)

и зафиксировать изменения в базе данных:

db.session.commit()

Хочу также отметить, что вам следует использовать случай верблюда, когда вы объявляете имя класса python, например, UserCountry или только Cuntry, и для объединения двух моделей (таблиц) вы не должны определять те же атрибуты, которые есть в классе User или в классе Country. По моему мнению, такой способ объединения двух таблиц является излишним.

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