Вложенная схема для таблицы связейPython

Программы на Python
Anonymous
Вложенная схема для таблицы связей

Сообщение Anonymous »


У меня возникли проблемы с сериализацией данных Joke со схемой, когда я добавил таблицу связей.

Вот моя модель, которая позволяет пользователям вводить шутку, а также тег для категоризации шутки:

класс Joke(db.Model): id = db.Column(db.Integer, Primary_key=True) шутка_имя = db.Column(db.String(40), nullable=False) шутка = db.Column(db.String(5000), nullable=False) шутка_владелец = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) шутка_категория = db.Column(db.Integer, db.ForeignKey('category.id'), nullable=True) шутка_создан = db.Column(db.DateTime, nullable=True) шутка_edited = db.Column(db.DateTime, nullable=True) tags = db.relationship('JokeTag', Secondary=tag_joke, backref=db.backref('jokes', lazy='dynamic'), lazy='dynamic', Primaryjoin=tag_joke.c.joke_id==id, Secondaryjoin=tag_joke.c.joketag_id==JokeTag.id) класс JokeTag(db.Model): id = db.Column(db.Integer, Primary_key=True) тег = db.Column(db.String(25), nullable=False) tag_owner = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) Вот моя таблица ассоциаций, которая соединяет их по принципу «многие ко многим»:
tag_joke = db.Table('tag_joke', db.Column('joke_id', db.Integer, db.ForeignKey('joke.id')), db.Column('joketag_id', db.Integer, db.ForeignKey('joke_tag.id')) )
Я пытаюсь сериализовать данные, используя следующую схему:

класс TagJokeSchema(ma.Schema): класс Мета: поля = ('joke_id', 'joketag_id') класс JokeSchema(ma.Schema): класс Мета: поля = ('id', 'joke_name', 'шутка', 'joke_owner', 'joke_category', 'joke_created', 'joke_edited', 'теги') tags=ma.Nested(TagJokeSchema, многие=True) Я делаю что-то не так со схемой, потому что когда я пытаюсь сериализовать данные следующим образом:

allnotes = Joke.query.filter_by(joke_owner=1).all() результат = шутки_схема.дамп(все примечания) Я получаю эту ошибку типа:

TypeError: объект типа AppenderBaseQuery не является сериализуемым в формате JSON

Когда я пытаюсь получить доступ к шуткам и тегам из командной строки Python, я могу получить доступ к шутке и соответствующим тегам. Хотя когда я пытаюсь напечатать шутку, это выглядит немного безумно:

Joke('35','Без причины','Финансисты получают положительные эффекты без всякой причины. Просто для работы с электронными таблицами Excel.','1','55', None, None, SELECT шутка_тег. id AS шутка_тег_id, шутка_тег.тег КАК шутка_тег_тег, шутка_тег.тег_владелец КАК шутка_тег_тег_владелец ИЗ шутки_tag, tag_joke ГДЕ tag_joke.joke_id = %s И tag_joke.joketag_id = шуточный_тег.id) Я надеялся получить более чистый отпечаток с вложенными туда тегами, если они у них есть.

изменить для @Greg0ry: Распечатка всех заметок выглядит так:

[Шутка('25','Тестовая шутка','Тук, тук, кто там, тестовая шутка','1','55', Нет, Нет, SELECT шутка_tag.id AS шутка_тег_ид, шутка_тег .tag AS шутка_tag_tag, шутка_tag.tag_owner AS шутка_tag_tag_owner FROM шутка_тег, tag_joke WHERE tag_joke.joke_id = %s И tag_joke.joketag_id = шутка_tag.id), Joke('35','Без причины','Финансисты получают положительный эффект без причины Просто для работы с электронными таблицами Excel.','1','55', None, None, ВЫБЕРИТЕ шуточный_тег.id КАК шуточный_тег_id, шутка_тег.тег КАК шуточный_тег_тег, шутка_тег.тег_владелец КАК шуточный_тег_тег_владелец ИЗ шуточный_тег, тег_joke ГДЕ тег_joke.joke_id = % s И tag_joke.joketag_id = шуточный_тег.id)] У меня также есть это в моем классе Joke, объясняющее распечатку. Я взял это из учебника на YouTube, который, как мне кажется, нашел (Кори Шейфер):

def __repr__(self): return f"Joke('{self.id}','{self.joke_name}','{self.joke}','{self.joke_owner}','{self.joke_category}', {self.joke_created} , {self.joke_edited}, {self.tags})" Что касается db.Model, возможно, я не понимаю, что вы ищете, но у меня есть вот это:

app = Flask(__name__) БД = SQLAlchemy (приложение) Надеюсь, у меня есть способ подробнее рассказать о том, что вы ищете?

А также, если я ищу конкретную шутку, делая

jokequery = Joke.query.filter_by(joke_owner=1, id=595).first() Я понимаю

Joke('595','test шутка','тук-тук, кто там тестирует шутку','1','475', None, None, SELECT шутка_tag.id AS шутка_tag_id, шутка_tag.tag AS шутка_тег_тег , шутка_tag.tag_owner КАК шутка_tag_tag_owner ИЗ шутки_tag, tag_joke ГДЕ tag_joke.joke_id = %s И tag_joke.joketag_id = шуточный_тег.id) Очевидно, что последняя часть выглядит довольно плохо. Это связано с тем, что tags — это AppenderBaseQuery
.
но если я это запущу:

jokequery.tags.all() вывод выглядит великолепно и представляет собой список, который можно сериализовать в формате JSON:

[JokeTag('45', 'stackoverflow', '1')] Но как мне это настроить, чтобы можно было отправлять для сериализации этот список, а не запрос?

Вернуться в «Python»