7

SQLAlchemyでは、ハイブリッド属性は、ORM マップ クラスに適用されるプロパティまたはメソッドのいずれかです。

class Interval(Base):
    __tablename__ = 'interval'

    id = Column(Integer, primary_key=True)
    start = Column(Integer, nullable=False)
    end = Column(Integer, nullable=False)

    def __init__(self, start, end):
        self.start = start
        self.end = end

    @hybrid_property
    def length(self):
        return self.end - self.start

    @hybrid_method
    def contains(self,point):
        return (self.start <= point) & (point < self.end)

    @hybrid_method
    def intersects(self, other):
        return self.contains(other.start) | self.contains(other.end)

これにより、クラス レベルとインスタンス レベルで異なる動作が可能になり、同じコードを使用して SQL ステートメントを簡単に評価できるようになります。

>>> i1 = Interval(5, 10)
>>> i1.length
5

>>> print Session().query(Interval).filter(Interval.length > 10)
SELECT interval.id AS interval_id, interval.start AS interval_start,
interval."end" AS interval_end
FROM interval
WHERE interval."end" - interval.start > :param_1

Djangoでは、モデルにプロパティがある場合、

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)

    def _get_full_name(self):
        "Returns the person's full name."
        return '%s %s' % (self.first_name, self.last_name)
    full_name = property(_get_full_name)

以下のことはできないことを承知の上で、

Person.objects.filter(full_name="John Cadengo")

DjangoにSQLAlchemyのハイブリッド属性に相当するものはありますか? そうでない場合、おそらく一般的な回避策はありますか?

4

2 に答える 2

3

フィルタはデータベースレベルで動作するため、Pythonプロパティに基づいてdjangoクエリセットフィルタを適用することはできません。DjangoにはSQLAlchemyのハイブリッド属性に相当するものはないようです。

ここここを見てください。回避策を見つけるのに役立つかもしれません。しかし、一般的な解決策はないと思います。

于 2012-10-23T23:10:55.787 に答える