Проблема сериализации зефира с помощником @pre_dump - PullRequest
0 голосов
/ 23 марта 2019

У меня есть приведенная ниже схема в Marshmallow

class JobSchema(ma.ModelSchema):



    title = fields.Str(required=True, validate=[validate.Length(min=4, max=80)])
    city = fields.Str(required=True, validate=[validate.Length(min=5, max=100)])
    state = fields.Str(required=True, validate=validate_state)
    zipCode = fields.Str(required=True, validate=validate_zipCode)
    description = fields.Str(required=False, validate=[validate.Length(max=250)])
    narrative = fields.Str(required=False, validate=[validate.Length(max=250)])
    companyLogo = fields.Str(required=False, validate=[validate.Length(max=250)])
    companyName = fields.Str(required=True, validate=[validate.Length(min=5, max=250)])
    companyURL = fields.Str(required=True, validate=[validate.Length(min=4, max=100)])
    latitude = fields.Str(required=True)
    longitude = fields.Str(required=True)
    time_created = fields.DateTime()
    active = fields.Boolean(required=True)

    @pre_dump(pass_many=True)
    def pre_dump_operations(self, data, many):
        import pdb; pdb.set_trace()

    @post_dump(pass_many=True)
    def post_dump_operations(self, data, many):
        import pdb; pdb.set_trace()

    class Meta:
        model = modelJob

I have a query that returns a list of Jobs plus a calculated value 

(distance) (, 7.56971 ..) Таким образом, значение, возвращаемое из запроса, находится в параметре 'data' во вспомогательном помощнике SQLAlchemy @pre_dump, как показано ниже (debuggin in @pre_dump)

    Pdb) data
   [(<Job 23>, 7.57971960007271), (<Job 25>, 8.00091287114993), (<Job 26>, 8.00091287114993), (<Job 24>, 9.19538792085964), (<Job 36>, 9.58169814221016)]

Взглянув на «себя» и «многие» (просто чтобы дать вам больше элементов), я получил

   (Pdb) self
     <JobSchema(many=True, strict=False)>
    (Pdb) many
     True

Хорошо, теперь я хочувозьмите расстояние и добавьте его в Job, чтобы оно поступало в сериализованное представление, как свойство Job (смотрите в конце сериализованный объект, как я хочу)

Просмотр дополнительных данных, которые я получил

 (Pdb) data[0]
 (<Job 23>, 7.57971960007271)

Выглядит легко, однако:

Pdb) type(data[0])
 <class 'sqlalchemy.util._collections.result'>

Итак, давайте посмотрим, что это такое

(Pdb) dir(data[0])
 ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '_asdict', '_fields', '_real_fields', 'count', 'distance', 'index', 'keys']

Продолжай копать Я получил:

 (Pdb) results = data[0]._asdict()
 (Pdb) results
 {'distance': 7.57971960007271}


    (    Pdb) data[0] 
    (<Job 23>, 7.57971960007271)

Так что я могуНесмотря на все вышеперечисленные детали, не удается понять, как сериализовать каждое задание, используя distance в качестве нового поля задания.как например, где теперь расстояние - это поле Иова

23: {
        "latitude": "25.824725",
        "title": "Job Title 1",
        "description": "DS",
        "companyName": "PySS",
        "id": 3,
        "zipCode": "33878",
        "state": "NY",
        "longitude": "-80.30476",
        "companyURL": "http://www.cnn.com",
        "city": "Miami"
        "distance": 7.57971960007271
    },

Кто-нибудь здесь, кто понимает и может объяснить это?Спасибо

...