SQLAlchemy backref остается пустым после изменения значения ячейки - PullRequest
0 голосов
/ 27 ноября 2018

Я использую Flask-SQLAlchemy и хочу создать отношение один ко многим.У меня есть класс мусорных контейнеров, и у каждого мусорного контейнера есть список пикапов.У меня есть страница «История пикапов», где я хочу показать все предыдущие пикапы.Если я изменю имя местоположения корзины, тогда на датчиках, которые ранее соответствовали этой корзине, теперь отображается пустое имя местоположения, как на изображении здесь .

. Очевидно, что корзинаОбновление имени прошло успешно, потому что вы видите «WEB» в правой части экрана.Я заметил, что если я изменил имя корзины до ее первоначального значения, то список раскладки работает правильно, я предполагаю, потому что он нашел корзину с именем, совпадающим с тем, которому он был изначально назначен.

Здесьмой код для обновления информации о корзине:

def update_dumpster(id):
    dump = Dumpster.query.get_or_404(id)
    form = UpdateDumpsterForm()
    if form.validate_on_submit():
        #Update the dumpster information
        dump.location = form.location.data
        dump.lat = form.lat.data
        dump.lng = form.lng.data
        dump.full = form.full.data
        for pickup in dump.pickups:
            pickup.dumpsterLocation = dump.location
        db.session.commit()

Изначально я не включил цикл for, но когда я заметил свою проблему, это была моя первая попытка решения.Я также попробовал pickup.dumpster.location = dump.location, но это также не помогло решить проблему.

Вот классы, которые я использую в models.py:

class Dumpster(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    location = db.Column(db.String, nullable=False)
    full = db.Column(db.Boolean, nullable=False)
    onRoute = db.Column(db.Boolean, nullable=False)
    lat = db.Column(db.Float, nullable=False)
    lng = db.Column(db.Float, nullable=False)
    pickups = db.relationship('Pickup', backref='dumpster', lazy=True)

    def __repr__(self):
        return "Dumpster({}, {})".format(self.id, self.location)

class Pickup(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
    time = db.Column(db.String, nullable=True, default='midnight')
    dumpsterLocation = db.Column(db.String, db.ForeignKey('dumpster.location'), nullable=False)

    def __repr__(self):
        return "Pickup({}, {}, {})".format(self.id, dumpster.location, self.date)

Любая помощь или понимание будут высоко оценены.

1 Ответ

0 голосов
/ 27 ноября 2018

Я наконец понял это.dump.location обновляется до нового значения, но затем сравнивается со старым значением pickup.dumpsterLocation.Я просто решил создать новую переменную с именем old_location и присвоить ей значение dump.location до того, как будет установлено новое местоположение.Затем я сравниваю pickup.dumpsterLocation со old_location.Вот так

РЕДАКТИРОВАТЬ: только для полноты, это то, что я изменил цикл на:

for pickup in Pickup.query.all():
        if pickup.dumpsterLocation == old_location:
            pickup.dumpsterLocation = dump.location
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...