In SQLAlchemy, a hybrid attribute is either a property or method applied to an ORM-mapped class,
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 = startself.end = end@hybrid_propertydef length(self):return self.end - self.start@hybrid_methoddef contains(self,point):return (self.start <= point) & (point < self.end)@hybrid_methoddef intersects(self, other):return self.contains(other.start) | self.contains(other.end)
This allows for distinct behaviors at the class and instance levels, thus making it simpler to evaluate SQL statements using the same code,
>>> 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
Now in Django, if I have a property on a model,
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)
It is my understanding that I can not do the following,
Person.objects.filter(full_name="John Cadengo")
Is there an equivalent of SQLAlchemy's hybrid attribute in Django? If not, is there perhaps a common workaround?