当前位置: 首页 > 面试题库 >

SQLAlchemy-编写用于子计数的混合方法

濮阳烨然
2023-03-14
问题内容

我正在使用Flask-
SQLAlchemy,并且试图在父模型中编写一种混合方法,该方法返回其具有的子代数,因此可以将其用于过滤,排序等。这是一些精简的代码我正在努力:

# parent.py
from program.extensions import db
from sqlalchemy.ext.hybrid import hybrid_method

class Parent(db.Model):
    __tablename__ = 'parents'
    parent_id = db.Column(db.Integer, primary_key=True)

    name = db.Column(db.String(80))
    children = db.relationship('Child', backref='parent', lazy='dynamic')

    def __init__(self, name):
        self.name = name

    @hybrid_method
    def child_count(self):
        return self.children.count()

    @child_count.expression
    def child_count(cls):
        return ?????

# child.py
from program.extensions import db
from program.models import Parent

class Child(db.Model):
    __tablename__ = 'children'
    child_id = db.Column(db.Integer, primary_key=True)
    parent_id = db.Column(db.Integer, db.ForeignKey(Parent.parent_id))

    name = db.Column(db.String(80))
    time = db.Column(db.DateTime)

    def __init__(self, name, time):
        self.name = name
        self.time = time

我在这里遇到两个问题。首先,我不知道“ child_count(cls)”到底要返回什么,它必须是一个SQL表达式…我认为应该像

return select([func.count('*'), from_obj=Child).where(Child.parent_id==cls.parent_id).label('Child count')

但我不确定。我遇到的另一个问题是,我无法从parent.py导入Child类,因此无论如何我都无法使用该代码。有什么办法可以使用字符串吗?例如,

select([func.count('*'), from_obj='children').where('children.parent_id==parents.parent_id').label('Child count')

最终,我想将方法​​更改为:

def child_count(cls, start_time, end_time):
    # return the number of children whose "date" parameter is between start_time and end_time

…但是现在,我只是想让它开始工作。非常感谢任何可以帮助我解决这个问题的人,因为我已经尝试了很长时间了。


问题答案:

以下代码显示了所有内容。

class Parent(Base):
    __tablename__ = 'parents'
    # ...

    @hybrid_property
    def child_count(self):
        #return len(self.children)   # @note: use when non-dynamic relationship
        return self.children.count()# @note: use when dynamic relationship

    @child_count.expression
    def child_count(cls):
        return (select([func.count(Child.child_id)]).
                where(Child.parent_id == cls.parent_id).
                label("child_count")
                )

    @hybrid_method
    def child_count_ex(self, stime, etime):
        return len([_child for _child in self.children
            if stime <= _child.time <= etime ])

    @child_count_ex.expression
    def child_count_ex(cls, stime, etime):
        return (select([func.count(Child.child_id)]).
                where(Child.parent_id == cls.parent_id).
                where(Child.time >= stime).
                where(Child.time <= etime).
                label("child_count")
                )


# usage of expressions:
stime, etime = datetime.datetime(2012, 1, 1), datetime.datetime(2012, 1, 31)
qry = session.query(Parent)
#qry = qry.filter(Parent.child_count > 2)
qry = qry.filter(Parent.child_count_ex(stime, etime) > 0)


 类似资料:
  • 本文向大家介绍BAT与HTML混合编程写法,包括了BAT与HTML混合编程写法的使用技巧和注意事项,需要的朋友参考一下 核心代码

  • 本文向大家介绍.NET Core3.1编写混合C++程序,包括了.NET Core3.1编写混合C++程序的使用技巧和注意事项,需要的朋友参考一下 前言 随着 .NET Core 3.1 的第二个预览版本发布,微软正式将 C++/CLI 移植到 .NET Core 上,从此可以使用 C++ 编写 .NET Core 的程序了。 由于目前仅有 MSVC 支持编译此类混合代码,并且由于涉及到非托管代码

  • 在这个msdn页面上,我读到: 应用程序不能为特定请求混合同步和异步方法。如果调用BeginGetRequestStream方法,则必须使用BeginGetResponse方法检索响应。 反之亦然吗?如果调用异步读取响应,是否还应该使用编写请求? 我的请求很小(100-1000个字符),响应可以很大。Jeffrey Richter的这篇文章似乎是说,在小负载的情况下,它可以同步完成(并且不需要设置

  • 混入 混入和函数定义方法一致,但是应用却大相径庭。 例如,下面有定义的border-radius(n)方法,其却作为一个mixin(如,作为状态调用,而非表达式)调用。 当border-radius()选择器中调用时候,属性会被扩展并复制在选择器中。 border-radius(n) -webkit-border-radius n -moz-border-radius n bor

  • 最近在工作中出现了一个关于Sets的讨论,Sets在Scala中支持方法,以及这可能导致bug的原因,例如。 我认为很明显,不应该支持操作,因为元素没有排序。但是,有人提出问题是实际上不是一个函子,不应该有方法。当然,在一个集合上映射可能会给自己带来麻烦。现在切换到Haskell, 现在在ghci中 因此不能满足函子定律 “替代似乎比必要的更强,基本上是对类型进行商数化,对使用类型的每个函数都提出

  • 我正在玩ruby混合的一些基础知识,由于某种原因无法从我的模块访问行为。 在Ruby Fiddle上运行它: 这会不断返回 我从tutorialspoint对mixin应该如何工作的理解让我觉得我应该能够有效地调用e.meow ,并返回与调用猫相同的结果。喵 。 这是RubyFiddle中的代码。 难以置信的基本,但你知道我在哪里跌倒吗?