স্কেলএলচেমি - সম্পর্কের বৈশিষ্ট্য দ্বারা ফিল্টারিং


95

এসকিউএএলএলচেমির সাথে আমার খুব বেশি অভিজ্ঞতা নেই এবং আমার একটি সমস্যা আছে, যা আমি সমাধান করতে পারি না। আমি অনুসন্ধান করার চেষ্টা করেছি এবং আমি প্রচুর কোড চেষ্টা করেছি। এটি আমার ক্লাস (সবচেয়ে উল্লেখযোগ্য কোডে হ্রাস):

class Patient(Base):
    __tablename__ = 'patients'
    id = Column(Integer, primary_key=True, nullable=False)
    mother_id = Column(Integer, ForeignKey('patients.id'), index=True)
    mother = relationship('Patient', primaryjoin='Patient.id==Patient.mother_id', remote_side='Patient.id', uselist=False)
    phenoscore = Column(Float)

এবং আমি সমস্ত রোগীদের জিজ্ঞাসা করতে চাই, যাদের মায়ের ফিনোস্কোর (উদাহরণস্বরূপ) == 10

যেমন বলা হয়েছে, আমি প্রচুর কোড চেষ্টা করেছি, তবে আমি তা পাই না। যৌক্তিকভাবে সমাধানটি আমার দৃষ্টিতে হবে

patients = Patient.query.filter(Patient.mother.phenoscore == 10)

কারণ, .mother.phenoscoreআউটপুট দেওয়ার সময় আপনি প্রতিটি উপাদানের জন্য অ্যাক্সেস করতে পারেন তবে, এই কোডটি এটি করে না।

কোনও সম্পর্কের কোনও বৈশিষ্ট্য (এসকিউএল স্টেটমেন্ট না লিখে বা একটি অতিরিক্ত যোগদানের বিবৃতি না দিয়ে) ফিল্টার করার কোনও (সরাসরি) সম্ভাবনা রয়েছে, আমার একাধিকবার এই ধরণের ফিল্টার প্রয়োজন need

এমনকি যদি কোনও সহজ সমাধান না হয় তবে আমি সমস্ত উত্তর পেয়ে খুশি।

উত্তর:


173

has()সম্পর্কের পদ্ধতি ব্যবহার করুন (আরও পাঠযোগ্য):

patients = Patient.query.filter(Patient.mother.has(phenoscore=10))

বা যোগদান (সাধারণত দ্রুত):

patients = Patient.query.join(Patient.mother, aliased=True)\
                    .filter_by(phenoscore=10)

9
রোগী = রোগী.কোয়ারি.ফিল্টার (রোগী.মাদার.হাস (রোগী.ফেনোসकोर == 10))
ব্যবহারকারী1105851

@ ব্যবহারকারী1105851 has()শর্ত বহিরাগত হিসাবে অজ্ঞাতনামা আর্গুমেন্ট এবং filter_byস্টাইল কীওয়ার্ড আর্গুমেন্ট উভয় সমর্থন করে । পরে আমার কাছে আরও পাঠযোগ্য বলে মনে হয়।
ডেনিস ওটকিডাচ

@DenisOtkidach সঠিক, কিন্তু তারপর এটি হবে phenoscore = 10filter_byকেবলমাত্র সমতা কীওয়ার্ড নেয় (যেহেতু এটি কেবল তাদের উপর ** কাওয়ারগুলি করছে)
aruisdante

@aruisdante আপনি ঠিকই বলেছেন, এটি উত্তরের ভুল কাজ ছিল।
ডেনিস ওটকিডাচ

4
যে কোনও পরিবর্তে ব্যবহার করুন: রোগীদের = রোগী.কোয়ারি.ফিল্টার (পেন্টেন্ট.মাদার.নে (ফেনোসকোর = 10))
বোস্টন কেন


7

আমি এটি সেশনগুলির সাথে ব্যবহার করেছি, তবে একটি বিকল্প উপায় যেখানে আপনি সরাসরি সম্পর্কের ক্ষেত্রে অ্যাক্সেস করতে পারবেন

db_session.query(Patient).join(Patient.mother) \
    .filter(Patient.mother.property.mapper.class_.phenoscore==10)

আমি এটি পরীক্ষা করে দেখিনি, তবে আমার ধারণা এটিও কার্যকর হবে

Patient.query.join(Patient.mother) \
    .filter(Patient.mother.property.mapper.class_.phenoscore==10)

5

আপনার জন্য সুসংবাদ: আমি সম্প্রতি প্যাকেজ তৈরি করেছি যা আপনাকে জ্যাঙ্গোর মতো "ম্যাজিকাল" স্ট্রিং দিয়ে ফিল্টারিং / বাছাই করে দেয় , যাতে আপনি এখন এর মতো কিছু লিখতে পারেন

Patient.where(mother___phenoscore=10)

এটি অনেক খাটো, বিশেষত জটিল ফিল্টারগুলির জন্য, বলুন,

Comment.where(post___public=True, post___user___name__like='Bi%')

আশা করি আপনি এই প্যাকেজটি উপভোগ করবেন

https://github.com/absent1706/sqlalchemy-mixins#django- Like-queries


1

এটি সম্পর্কে কীভাবে সম্পর্ক জিজ্ঞাসা করা যায় তার আরও সাধারণ উত্তর।

relationship(..., lazy='dynamic', ...)

এটি আপনাকে এটি করতে দেয়:

parent_obj.some_relationship.filter(ParentClass.some_attr==True).all()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.