我正在创建一个简单的CRUD应用程序。我正在使用Flask,我决定使用SQLAlchemy作为ORM,使用棉花糖作为有效负载的验证
我目前的问题是尽量减少需要写入的复制量
在这种情况下,我们只是处理帖子
型号.py
class Post(Base):
__tablename__ = 'posts'
id = Column(UUID(as_uuid=True), primary_key=True)
user_id = Column(UUID(as_uuid=True), ForeignKey('users.id'))
title = Column(String(length=50))
schemas.py
class CreatePostSchema(Schema):
title = fields.Str(required=True)
我不需要id
和user_id
,因为它们将由后端创建/找到,但所有其他字段都是必需的
我正在使用蓝图,与后期创建相关联的一个路由/端点将具有post()
方法
我可以创建装饰器,首先确保模式正确,获取用户并将其传递到post方法:
@auth_required()
@validate_schema(CreatePostSchema)
def post(request, user_id, cleaned_schema):
create_post(cleaned_schema)
return 200
现在,我可以编写create_post()
函数,而无需硬编码键,如:
def create_post(user_id, **clean_data)
post = models.Post(**clean_data)
post.user_id = user_id
但这是一种良好的做法吗?或者我应该明确地声明密钥,如:
def create_post(user_id, title)
post = models.Post(title=title)
post.user_id = user_id
post.id = uuid4()
return post
然后我还有一个问题,在哪个阶段进行验证。验证应该在post()
方法之前进行,还是在创建post期间进行?例如,我可以这样做:
def create_post(user_id, **data):
clean_data = CreatePostSchema.load(**data)
post = models.Post(**clean_data)
session.add(post)
session.commit()
return
这样我就可以删除额外的@has_schema()
装饰器
更新是另一种不用重复键就可以编写的beast。让我们假设只有1个字段和EditPostSchema = CreatePostSchema
。事实上,我会有更多,例如创建日期、更新日期、描述等
clean_data = EditPostSchema.load(**data)
id = clean_data.pop('id')
update_post(id, clean_data)
def update_post(id, **clean_data):
session.query(Post).get(id).update(**clean_data, synchronize_session=False)
return
所以本质上,我认为Schemas
应该已经解释了我需要的CRUD字段,所以我没有必要重复它们。我说得对吗
可以使用webargs使用棉花糖模式验证输入数据
如果希望避免代码重复,还可以尝试marshmallow-sqlalchemy从模型生成API模式
如果API与模型足够接近,您可以通过在POST中传递输入数据来创建对象:
更新确实不同。有些人只是用传入的数据更新对象,但这可能并不适用于所有情况,因为数据中的空字段会导致对象中的字段被删除
您可以对要更新的字段进行harcode
在我的一个应用程序中,我创建了一个函数,该函数将模式作为参数,并使用它来知道需要哪些字段,并使用传入数据更新对象,包括删除该数据中缺少的字段
相关问题 更多 >
编程相关推荐