2012-06-13 19 views
8

ho cercato di creare un modello di Django con una proprietà pitone, in questo modo:modelli Django e Python proprietà

class Post(models.Model): 
    _summary = models.TextField(blank=True) 
    body = models.TextField() 

    @property 
    def summary(self): 
     if self._summary: 
      return self._summary 
     else: 
      return self.body 

    @summary.setter 
    def summary(self, value): 
     self._summary = value 

    @summary.deleter 
    def summary(self): 
     self._summary = '' 

Fin qui tutto bene, e nella console posso interagire con la proprietà di sintesi solo bene. Ma quando provo a fare qualsiasi cosa con questo Django-y, come lo Post(title="foo", summary="bar"), si prova un attacco. C'è un modo per fare in modo che Django giochi con le proprietà Python?

+0

Questo è il metodo standard in Python (http://docs.python.org/library/functions.html#property) - Sto solo usando lo stile decoratore invece di chiamare esplicitamente 'property'. – futuraprime

+0

Intendi 'Post (body =" foo ", summary =" bar ")'? (Nota che 'body' invece di' title'). Questo dovrebbe funzionare. – okm

+0

@okmro Ho corretto quel refuso. Era solito dire "Post (title =" foo ", summary =" bar ")" che era un ovvio errore. – Buttons840

risposta

12

Sfortunatamente, i modelli Django non funzionano molto bene con le proprietà Python. Il modo in cui funziona, l'ORM riconosce solo i nomi delle istanze di campo nei filtri QuerySet.

Nei filtri non è possibile fare riferimento a summary, ma sarà necessario utilizzare _summary. Questo diventa disordinato reale veloce, ad esempio per fare riferimento a questo campo in una query multi-tavolo, dovreste usare qualcosa come

User.objects.filter(post___summary__contains="some string") 

Vedi https://code.djangoproject.com/ticket/3148 per maggiori dettagli sul sostegno proprietà.

+0

Hai provato? [Il codice] (https://github.com/django/django/commit/90acc8ff7e1b27b5c2f7cd5a2440d94d5fa22445#L0R153) mostra che è possibile assegnare la proprietà tramite 'kwargs' da 5 anni fa ... – okm

+0

Oh, sembra che tu abbia ragione - il il costruttore supporta le proprietà; questo è per supportare 'GenericForeignKey'. Tuttavia, l'altro argomento su QuerySets contiene. – koniiiik