Как использовать полиморфизм для динамического создания класса в Flask с помощью sqlalchemy?Python

Программы на Python
Anonymous
Как использовать полиморфизм для динамического создания класса в Flask с помощью sqlalchemy?

Сообщение Anonymous »

Я пытаюсь обработать вводимые пользователем данные в форме. Объявление — это базовый класс, Жилье, Продажа, Работа — его дочерние классы. Я хочу создать соответствующий класс на основе разных входных данных. В настоящее время я использую оператор if для различения разных классов. Есть ли способ динамически создать класс? И я получаю предупреждение «SAWarning: очистка объекта с несовместимым полиморфным идентификатором «Жилье»; объект может не обновляться и/или загружаться правильно», как только я нажимаю «Отправить» в форме.
Соответствующий код:

Код: Выделить всё

model.py
class Ad(db.Model):
id = db.Column(db.Integer, primary_key=True)
subject = db.Column(db.String(50), nullable=False)
body = db.Column(db.Text, nullable=False)
subcategory_id = db.Column(db.Integer, db.ForeignKey('subcategory.id'), nullable=False)
Ad_type = db.Column(db.String(50), nullable=False)
photos = db.relationship('Photo',cascade='all, delete-orphan')
__mapper_args__ = {
'polymorphic_identity': 'ad',
"polymorphic_on": Ad_type
}

class HousingAd(Ad):
__tablename__ = 'housing_ad'
rent = db.Column(db.Float)
rent_period = db.Column(db.Enum('day', 'week', 'month'))
type = db.Column(db.Enum('room', 'house', 'homestay', 'vacation', 'other'))
__mapper_args__ = {
'polymorphic_identity': 'housing',
}

class ForSaleAd(Ad):
__tablename__ = 'for_sale_ad'
price = db.Column(db.Float)
brand = db.Column(db.String(50))
condition = db.Column(db.Enum('new','used','deficiency'))
__mapper_args__ = {
'polymorphic_identity': 'for_sale',
}

class JobAd(Ad):
__tablename__ = 'job_ad'
industry = db.Column(db.String(50))
compensation = db.Column(db.String(50))
__mapper_args__ = {
'polymorphic_identity': 'job',
}
class Photo(db.Model):
id = db.Column(db.Integer, primary_key=True)
filename = db.Column(db.String(255), nullable=False)
ad_id = db.Column(db.Integer, db.ForeignKey('ad.id'))
ad_type =  db.Column(db.Integer, db.ForeignKey('category.id'))

class Category(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50), unique=True, nullable=False)
subcategory = db.relationship('Subcategory')

class Subcategory(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50),nullable=False)
category_id = db.Column(db.Integer, db.ForeignKey('category.id'), nullable=False)
ad = db.relationship('Ad')

Код: Выделить всё

auth.py
@auth.route("/post-ads//", methods=['GET','POST'])
@login_required
def post_ad(category,subcategory):
if request.method == 'POST':
subject = request.form.get('subject')
body = request.form.get('body')
photos =request.files.getlist('photo')
if category == 'Housing':
housingAd = HousingAd(subject=subject, body=body, Ad_type=category, user_id=userId, subcategory_id=subcategoryId)
db.session.add(housingAd)
db.session.commit()
ad_id=housingAd.id
if category == 'For Sale':
pass
if category == 'Jobs':
pass

ad_type = Category.query.filter_by(name=category).first().id
createPhoto(photos,ad_id,ad_type)
flash('post ad successfully!','success')
return redirect(url_for('auth.home'))

def createPhoto(photos,ad_id,ad_type):
uploads_folder = path.join(getcwd(),Config.UPLOAD_FOLDER)
if not path.exists(uploads_folder):
makedirs(uploads_folder)
if photos:
for photo in photos:
if photo and photo.filename:
photo.save(path.join(uploads_folder, photo.filename))
new_photo = Photo(filename=photo.filename,ad_id=ad_id,ad_type=ad_type)
db.session.add(new_photo)
db.session.commit()
else:
flash('No file selected or file is empty.','danger')
Я выбрал «polymorphic_on»: Ad_type и использую ad_type, чтобы различать тип объявления, и ad_id, чтобы связать фотографию с объявлением. Я могу получить все данные пользователя и фотографии, загруженные пользователем. Но объявление не создается и не сохраняется в базе данных.

Подробнее здесь: https://stackoverflow.com/questions/790 ... sqlalchemy

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