2012-08-31 10 views
6

In SQLAlchemy, un hybrid attribute o è un metodo property o applicata a una classe ORM-mappata,Django ORM ha un equivalente per l'attributo ibrido di SQLAlchemy?

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) 

Ciò consente comportamenti distinti a livello di classe e istanza, rendendo così più semplice valutare istruzioni SQL utilizzando la stesso codice,

>>> 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 

Ora in Django, se ho una proprietà su un modello,

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) 

È mia understanding che posso non effettuare le seguenti operazioni,

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

Esiste un equivalente di un attributo ibrido di SQLAlchemy a Django? In caso contrario, c'è forse una soluzione comune?

risposta

2

Hai ragione che non puoi applicare il filtro del queryset django basato sulle proprietà python, perché il filtro opera a livello di database. Sembra che non ci sia un equivalente degli attributi ibridi di SQLAlchemy in Django.

Si prega di dare un'occhiata here e here, potrebbe essere che ti aiuterà a trovare una soluzione alternativa. Ma, penso che non ci sia una soluzione generica.

Problemi correlati