2012-08-31 5 views
6

In SQLAlchemy ein hybrid attribute ist entweder eine property oder eine ORM-mapped Klasse angewandte Methode,Hat Django ORM eine Entsprechung zu SQLAlchemy's Hybrid Attribut?

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) 

Diese für unterschiedliche Verhaltensweisen an den Klassen- und Instanzebenen, wodurch es einfacher zu bewerten SQL-Anweisungen die erlaubt gleicher 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 

Jetzt in Django, wenn ich eine Eigenschaft auf einem Modell,

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) 

Es ist mein understanding, die ich kann nicht folgendes tun,

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

Gibt es ein Äquivalent von SQLAlchemy Hybrid-Attribut in Django? Wenn nicht, gibt es vielleicht einen gemeinsamen Workaround?

Antwort

2

Sie haben Recht, dass Sie den Filter django queryset basierend auf Python-Eigenschaften nicht anwenden können, da der Filter auf Datenbankebene arbeitet. Es scheint, dass es in Django kein Äquivalent von SQLAlchemys hybriden Attributen gibt.

Bitte sehen Sie sich here und here an, vielleicht hilft es Ihnen, einen Workaround zu finden. Aber ich denke, es gibt keine generische Lösung.

Verwandte Themen