SQLAlchemy“设置” event.listen的问题

时间:2019-04-25 07:22:37

标签: python flask sqlalchemy marshmallow

我在event.listen(Model.attribute, 'set')中设置模型的属性值时遇到问题。当我在单元测试中检查我的值时,有时(〜5/10情况)已设置并通过了测试,但有时未通过(断言失败)。

库版本:

  • marshmallow==2.16.3
  • marshmallow-sqlalchemy==0.15
  • Flask==1.0.2
  • Flask-SQLAlchemy==2.3.1
  • SQLAlchemy==1.2.7
from datetime import datetime
from unittest import TestCase

import pytz
from sqlalchemy import DateTime, Column, event

from base import Model


class UserSchema():

    class Meta:
        model = User

class DAL():

    def create_or_update_user(self, user_data, partial=False):
        session = self._get_session()

        user_id = user_data.pop('id', None)
        if user_id:
            user_obj = self._get_obj(User, user_id)
            session = self._get_session(user_obj)
            user_obj = UserSchema(strict=True, session=session, partial=partial).load(user_data, instance=user_obj).data
        else:
            user_obj = UserSchema(strict=True, session=session).load(user_data).data
            session.add(user_obj)

        session.commit()
        return user_obj


class User(Model):

    status_updated = Column(DateTime)

    @staticmethod
    def set_status_updated(target, value, oldvalue, initiator):
        target.status_updated = datetime.now(pytz.utc)

    def __new__(cls, *args, **kwargs):
        obj = super(User, cls).__new__(cls)

        event.listen(cls.status, 'set', cls.set_status_updated, propagate=True)

        return obj


class USerTestCase(TestCase):

    def test_update_user(self):
        user_data = {
            'id': 1,
            'name': 'John',
            'status': 'New'
        }
        user = self.app.dal.create_or_update_user(user_data=user_data)
        assert user.status_updated is not None


有人遇到过类似的问题吗?

0 个答案:

没有答案