मेरे पास एक टेबल पर एक मैपर है और मैं एक कॉलम_प्रॉपर्टी को परिभाषित करना चाहता हूं जिसे सही या गलत का चयन करना चाहिए कि इकाई में कुछ संपत्ति है या नहीं:
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],
जो मुझे शर्त के आधार पर कॉलम के लिए एक मान सेट करने देता है।
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)
संबंधित सवाल
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।