TypeError:filter_by()只取1个参数(给定2个)

时间:2017-08-22 21:41:45

标签: python sqlalchemy

我正在关注Flask-SQLalchemy update a row's information以尝试更新端点中的对象。我有:

def dashboard_presave_callback(data, existing_id=None):
    # if existing_id, overwrite...else, make new item
    print(data)
    url_to = data.get('url_to', None)
    print(url_to)
    if isinstance(url_to, str):
        pass
    else:
        url_to = json.dumps(url_to)

    if existing_id:
        data.update({'id': existing_id})
        obj = DashboardItem.query.filter_by(id==existing_id).update(data)
        # obj.update(data)
    else:
        obj = DashboardItem(**data)
        DB.session.add(obj)

    DB.session.commit()



class GenericApiView(JsonApiView):


    # @jwt_required()
    def post(self, model_type):
        request_json = request.get_json()
        dashboard_presave_callback(request_json)
        return Response({'message': 'ok'}, 200)

    def put(self, model_type):
        request_json = request.get_json()
        existing_id = request_json['id']
        del request_json['id']
        dashboard_presave_callback(request_json, existing_id)
        return Response({'message': 'ok'}, 200)

模型看起来像

class DashboardItem(DB.Model):
    __tablename__ = 'dashboard_item'

    id = DB.Column(DB.Integer, primary_key=True)
    user_email = DB.Column(DB.String(200), unique=True, nullable=False)
    url_to = DB.Column(DB.Text)
    display_text = DB.Column(DB.String(200), nullable=False)

    # https://stackoverflow.com/questions/8098122/mongoengine-creation-time-attribute-in-document
    def save(self, *args, **kwargs):
        print('huh?')
        print(args)
        print(kwargs)
        self.url_to = 'it worked'
        return super(DashboardItem, self).save(*args, **kwargs)

我这样做是因为我的save无效,但这种方式很好,因为我想在update上做同样的行为。

我得到了

    obj = DashboardItem.query.filter_by(id==existing_id).update(data)
TypeError: filter_by() takes exactly 1 argument (2 given)
似乎我在示例中做了同样的事情。为什么这个filter_by不起作用?

1 个答案:

答案 0 :(得分:3)

obj = DashboardItem.query.filter_by(id=existing_id).update(data)

你有一个额外的=标志,让它传递一个布尔值。 filter_by应该只接受一个DashboardItem.query的参数。您已使用.表示法隐式传递此内容。您需要提供的所有其他参数(包括id)都是命名参数。