2011-12-19 55 views
49

Tôi không có nhiều kinh nghiệm với SQLAlchemy và một vấn đề, mà tôi không thể giải quyết nhưng tìm kiếm một cố gắng rất nhiều mã. Đây là lớp của tôi (giảm xuống mã quan trọng nhất):SqlAlchemy - Lọc theo mối quan hệ Thuộc tính

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) 

và tôi muốn truy vấn tất cả bệnh nhân, có mẹ của phenoscore là (ví dụ) == 10

Như đã nói, tôi đã cố gắng rất nhiều mã, nhưng tôi không hiểu. Giải pháp hợp lý, trong mắt tôi, sẽ là

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

bởi vì, bạn có thể truy cập .mother.phenoscore cho mỗi phần tử khi xuất, nhưng mã này không thực hiện. Có khả năng (trực tiếp) để lọc theo thuộc tính của một mối quan hệ (mà không cần viết câu lệnh SQL, hoặc thêm câu lệnh nối), tôi cần loại bộ lọc này nhiều hơn một lần.

Thậm chí nếu không có giải pháp dễ dàng, tôi hài lòng về tất cả các câu trả lời

thanks a lot Christo

Trả lời

88

Sử dụng phương pháp has() của mối quan hệ (dễ đọc hơn):

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

hoặc tham gia (thường là nhanh hơn):

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

bệnh nhân = Patient.query.filter (Patient.mother.has (Patient.phenoscore == 1 0)) – user1105851

+0

@ user1105851 'has()' hỗ trợ cả biểu thức điều kiện dưới dạng đối số chưa đặt tên và đối số từ khóa 'filter_by'. Sau này có vẻ dễ đọc hơn với tôi. –

+0

@DenisOtkidach đúng, nhưng sau đó nó sẽ là 'phenoscore = 10'. 'filter_by' chỉ lấy từ khóa bình đẳng (vì nó chỉ thực hiện ** kwargs trên chúng) – aruisdante

2

Tin tốt cho bạn: Gần đây tôi đã gói cung cấp cho bạn cách lọc/sắp xếp với chuỗi "kỳ diệu" as in Django, vì vậy bây giờ bạn có thể viết một cái gì đó giống như

Patient.where(mother___phenoscore=10) 

Đó là ngắn hơn rất nhiều, đặc biệt là cho các bộ lọc phức tạp, chẳng hạn,

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

Hồ pe bạn sẽ tận hưởng gói này

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

1

tôi đã sử dụng nó với các phiên, nhưng một cách thay thế nơi bạn có thể truy cập vào các lĩnh vực quan hệ trực tiếp là

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

tôi đã không kiểm tra nó, nhưng tôi đoán điều này cũng sẽ làm việc

Patient.query.join(Patient.mother) \ 
    .filter(Patient.mother.property.mapper.class_.phenoscore==10) 
Các vấn đề liên quan