【问题标题】:How to define a marshamllow List field using marshmallow_sqlalchemy如何使用 marshmallow_sqlalchemy 定义棉花糖列表字段
【发布时间】:2021-05-18 22:56:55
【问题描述】:

我正在尝试使用 marshmallow_sqlalchemy 创建一个模式。我想从数据库的两个条目 x_coordinate 和 y_coordinate 创建一个列表,但是我不知道该怎么做。

这是架构

from marshmallow_sqlalchemy import SQLAlchemySchema, auto_field
class LocationSQLAlchemySchema(SQLAlchemySchema):
    class Meta:
        model = Location
        load_instance = True
    
    location_id = auto_field('id')
    name = auto_field('name')
    user_uid = auto_field('customer_id')
    maps_url = auto_field('maps_url')
    coordinates = fields.List(Meta.model.x_coordinate,Meta.model.y_coordinate) #This is what I don't know how to define.

这是我用于此架构的模型:

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.dialects.mysql import INTEGER
db = SQLAlchemy()
class Location(db.Model):
    __tablename__ = 'cleaning_locations'
    id = db.Column(db.String(128), primary_key=True, unique = True)
    name =  db.Column(db.String(45), nullable = False)
    customer_id = db.Column(db.String(45),nullable = False)
    maps_url = db.Column(db.String(2048),nullable = False)
    x_coordinate = db.Column(db.Numeric(precision = 8, scale=5), nullable = False)
    y_coordinate = db.Column(db.Numeric(precision = 8, scale=5), nullable = False)
    address = db.Column(db.String(255))
    country = db.Column(db.String(45))
    state = db.Column(db.String(45))
    size = db.Column(INTEGER(unsigned=True), nullable = False )
    rooms = db.Column(INTEGER(unsigned=True), nullable = False )
    bathrooms = db.Column(INTEGER(unsigned=True), nullable = False )
    kitchens = db.Column(INTEGER(unsigned=True), nullable = False )

  1. 如何使 Schema 将坐标表示为包含 x_coordinate 和 y_coordinate 的列表?
  2. (新手额外问题)。在 db 模型和 Schema 中使用不同的变量名是一种不好的做法吗?

【问题讨论】:

    标签: flask sqlalchemy marshalling marshmallow marshmallow-sqlalchemy


    【解决方案1】:

    请试试这个(未经测试):

    from marshmallow_sqlalchemy import field_for
    
    [...]
    
    coordinates = fields.Tuple(
        (field_for(Location, "x_coordinate"), field_for(Location, "y_coordinate"))
    )
    

    不确定这是不是最好的主意,因为这样您就不能只将从架构加载的数据塞进对象 init 中。但没有什么能阻止您拥有与 DB 表示不同的 API(架构)。

    【讨论】:

      猜你喜欢
      • 2016-01-14
      • 1970-01-01
      • 1970-01-01
      • 2018-09-19
      • 2021-02-12
      • 1970-01-01
      • 1970-01-01
      • 2017-02-02
      • 1970-01-01
      相关资源
      最近更新 更多