मेरे पास एक टेबल पर एक मैपर है और मैं एक कॉलम_प्रॉपर्टी को परिभाषित करना चाहता हूं जिसे सही या गलत का चयन करना चाहिए कि इकाई में कुछ संपत्ति है या नहीं:

mapper( Person, persons_table, properties = {
    'administrator': column_property( 
        select( 
            [True if roles_table.c.is_admin or roles_table.c.id == 1 else False],
            roles_table.c.id == persons_table.c.role_id
        ).label( 'administrator' )
        )
} )

क्या यह कुछ मैं कर सकता हूँ? मुझे इस भाग में अधिक दिलचस्पी है: [True if roles_table.c.is_admin or roles_table.c.id == 1 else False], जो मुझे शर्त के आधार पर कॉलम के लिए एक मान सेट करने देता है।

3
Romeo M. 21 अक्टूबर 2011, 15:09
इसे bw करना है क्योंकि यह एक कॉलम प्रॉपर्टी है। क्या आपने स्क्लेल्केमी के साथ काम किया है?
 – 
Romeo M.
21 अक्टूबर 2011, 16:44

1 उत्तर

सबसे बढ़िया उत्तर

आपका चयन-अभिव्यक्ति वास्तव में एक पायथन अभिव्यक्ति है:

select([True if roles_table.c.is_admin or roles_table.c.id == 1 else False],
       roles_table.c.id == persons_table.c.role_id)

sqlalchemy.select() इसे इस प्रकार देखेंगे:

select([True], some_expression_object)

चूंकि कॉलम ऑब्जेक्ट roles_table.c.is_admin बूलियन संदर्भ में True का मूल्यांकन करेगा। मैं अपने सिर के ऊपर से नहीं जानता कि SQLAlchemy इसकी व्याख्या कैसे करेगा, लेकिन यह निश्चित रूप से आपके इरादे से काम नहीं करेगा।

आपको इस व्यंजक को फिर से लिखना होगा ताकि यह if ... else ... के बजाय "nofollow">sqlalchemy.sql.expression.case():

column_property(
    select([case([(roles_table.c.is_admin, 1),
                  (roles_table.c.id == 1, 1)], else_=0)],
           roles_table.c.id == persons_table.c.role_id))

हालांकि, आपके मामले में, एक बहुत आसान समाधान हो सकता है। ऐसा लगता है कि Person और Role का एक N:1 संबंध है (एक व्यक्ति की बिल्कुल एक भूमिका है)। मुझे लगता है कि एक व्यक्ति की भूमिका पाने के लिए एक orm.relationship Person.role है।

आप सिर्फ एक सादा पायथन संपत्ति क्यों नहीं जोड़ते:

class Person:
    # ...

    @property
    def administrator(self):
        return self.role and (self.role.is_admin or self.role.id == 1)
4
Ferdinand Beyer 21 अक्टूबर 2011, 17:22