2012-11-30 9 views
13

मैं फ्लास्क-स्क्लाक्लेमी का उपयोग कर रहा हूं, और मैं एक माता-पिता मॉडल में hybrid method लिखने की कोशिश कर रहा हूं जो कि बच्चों की संख्या लौटाता है, इसलिए मैं फ़िल्टरिंग के लिए इसका उपयोग कर सकता हूं, सॉर्टिंग आदि यहाँ मैं क्या कोशिश कर रहा हूँ के कुछ कोड नीचे छीन लिया है: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 (सीएलएस)" है, जो एक SQL अभिव्यक्ति हो गया है में वापस जाने के लिए नहीं पता ... मुझे लगता है कि ऐसा लगता है जैसे

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

कुछ किया जाना चाहिए, लेकिन मैं नहीं कर रहा हूँ ज़रूर। मेरे पास एक और मुद्दा यह है कि मैं paren.py से बाल वर्ग आयात नहीं कर सकता, इसलिए मैं उस कोड का उपयोग किसी भी तरह से नहीं कर सका। क्या इसके लिए स्ट्रिंग का उपयोग करने का कोई तरीका है? उदाहरण के लिए,

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 

... लेकिन अब के लिए, मैं सिर्फ यह काम करने के लिए प्राप्त करने की कोशिश कर रहा हूँ। जो भी इस के साथ मेरी मदद कर सकता है, उसके लिए बहुत धन्यवाद, क्योंकि मैं इसे लंबे समय से समझने की कोशिश कर रहा हूं।

उत्तर

16

नीचे दिया गया कोड यह सब दिखाता है।

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) 
+0

आह, बहुत बहुत धन्यवाद! आपने अंततः इसे समझने में मेरी मदद की है। – fimbul

+0

यह वही है जो मैं ढूंढ रहा था! धन्यवाद! – Stanislav

-3

मुझे लगता है कि तुम सिर्फ संख्या प्राप्त करने के लिए सादे ol 'लेन और hybrid_property उपयोग कर सकते हैं:

@hybrid_property 
def child_count(self): 
    return len(self.children) 

दस्तावेज़ में ऐसा दिखता है जैसे, चाल करना चाहते हैं जब तक मैं कुछ याद कर रहा हूँ?

duggars = db.session.query(Parent).filter(Parent.child_count > 17) 
+0

यह मान्य हाइब्रिड_प्रोपर्टी नहीं है क्योंकि 'लेन' रिश्ते पर एक वैध SQLAlchemy ऑपरेशन नहीं है। – davidism

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