2012-08-31 4 views
6

hybrid attributepropertyまたはメソッドがORMマッピングされたクラスに適用されるか、Django ORMにはSQLAlchemyのハイブリッド属性と同等の機能がありますか? <a href="http://docs.sqlalchemy.org/en/rel_0_7/index.html" rel="nofollow noreferrer">SQLAlchemy</a>で

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文を評価すること、クラスおよびインスタンスレベルで異なる挙動を可能にします同じコード、Djangoで今

>>> 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 

、私はモデルのプロパティを持っている場合は、

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") 

はジャンゴでSQLAlchemyのハイブリッドの属性に相当があり、私はは、次の操作を行うことができない私のunderstandingのですか?そうでない場合は、おそらく一般的な回避策ですか?

答えて

2

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

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

関連する問題

 関連する問題