2012-08-31 23 views
6

Trong SQLAlchemy, một hybrid attribute hoặc là một phương pháp property hay áp dụng cho một lớp ORM ánh xạ,Django ORM có tương đương với thuộc tính Hybrid của SQLAlchemy không?

class Interval(Base): 
    __tablename__ = 'interval' 

    id = Column(Integer, primary_key=True) 
    start = Column(Integer, nullable=False) 
    end = Column(Integer, nullable=False) 

    def __init__(self, start, end): 
     self.start = start 
     self.end = end 

    @hybrid_property 
    def length(self): 
     return self.end - self.start 

    @hybrid_method 
    def contains(self,point): 
     return (self.start <= point) & (point < self.end) 

    @hybrid_method 
    def intersects(self, other): 
     return self.contains(other.start) | self.contains(other.end) 

Điều này cho phép các hành vi khác nhau ở cấp lớp và ví dụ, do đó làm cho nó đơn giản để đánh giá câu lệnh SQL bằng cách sử dụng cùng mã,

>>> i1 = Interval(5, 10) 
>>> i1.length 
5 

>>> print Session().query(Interval).filter(Interval.length > 10) 
SELECT interval.id AS interval_id, interval.start AS interval_start, 
interval."end" AS interval_end 
FROM interval 
WHERE interval."end" - interval.start > :param_1 

Bây giờ trong Django, nếu tôi có một tài sản trên một mô hình,

class Person(models.Model): 
    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=50) 

    def _get_full_name(self): 
     "Returns the person's full name." 
     return '%s %s' % (self.first_name, self.last_name) 
    full_name = property(_get_full_name) 

Đó là understanding mà tôi có thể không làm như sau,

Person.objects.filter(full_name="John Cadengo") 

Có một tương đương với thuộc tính lai SQLAlchemy trong Django của tôi? Nếu không, có lẽ có một cách giải quyết chung?

Trả lời

2

Bạn nói đúng là bạn không thể áp dụng bộ lọc truy vấn django dựa trên thuộc tính python, bởi vì bộ lọc hoạt động ở cấp cơ sở dữ liệu. Có vẻ như không có tương đương thuộc tính lai của SQLAlchemy ở Django.

Vui lòng xem herehere, có thể sẽ giúp bạn tìm giải pháp thay thế. Nhưng, tôi nghĩ không có giải pháp chung.

Các vấn đề liên quan