2012-08-31 14 views
6

SQLAlchemy में, एक hybrid attribute या तो एक property या विधि एक ORM-मैप किया वर्ग के लिए आवेदन किया है,क्या Django ORM SQLAlchemy के हाइब्रिड विशेषता के बराबर है?

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) 

यह है मेरी understanding कि मैं नहीं निम्नलिखित कर सकते हैं,

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

वहाँ Django में SQLAlchemy की संकर विशेषता के एक बराबर है? यदि नहीं, तो शायद एक आम कामकाज है?

उत्तर

2

आप सही हैं कि आप python गुणों के आधार पर django क्वेरीसेट फ़िल्टर लागू नहीं कर सकते हैं, क्योंकि फ़िल्टर डेटाबेस स्तर पर चल रहा है। ऐसा लगता है कि Django में SQLAlchemy के संकर गुणों के बराबर नहीं है।

कृपया, here और here पर एक नज़र डालें, हो सकता है कि यह आपको कामकाज खोजने में मदद करेगा। लेकिन, मुझे लगता है कि कोई सामान्य समाधान नहीं है।

संबंधित मुद्दे