2012-06-13 9 views
8

Próbowałem założyć modelu Django z właściwością Pythona, tak jak:modele Django i właściwości Python

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

tej pory tak dobrze, aw konsoli mogę wchodzić w interakcje z właściwością tylko podsumowania w porządku. Ale kiedy próbuję zrobić cokolwiek Django-y z tym, jak Post(title="foo", summary="bar"), rzuca dopasowanie. Czy jest jakiś sposób, aby Django mógł grać ładnie z właściwościami Pythona?

+0

Jest to standardowa metoda w Pythonie (http://docs.python.org/library/functions.html#property) - Używam tylko stylu dekoratora zamiast jawnie wywoływać 'właściwość'. – futuraprime

+0

Masz na myśli 'Post (body =" foo ", summary =" bar ")'? (Zauważ, że 'body' zamiast' title'). To powinno działać. – okm

+0

@okm Naprawiłem tę literówkę. Kiedyś mówiono 'Post (title =" foo ", summary =" bar ")', co było oczywistym literówką. – Buttons840

Odpowiedz

12

Niestety, modele Django nie grają zbyt dobrze z właściwościami Pythona. W sposobie działania ORM rozpoznaje tylko nazwy instancji pól w filtrach QuerySet.

Nie będziesz w stanie odnosić się do summary w swoich filtrach, zamiast tego będziesz musiał użyć _summary. To dostaje bałagan bardzo szybko, na przykład w odniesieniu do tego pola w zapytaniu multi-table, trzeba by użyć czegoś jak

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

Zobacz https://code.djangoproject.com/ticket/3148 więcej szczegółów na temat obsługi nieruchomości.

+0

Czy próbowałeś tego? [Kod] (https://github.com/django/django/commit/90acc8ff7e1b27b5c2f7cd5a2440d94d5fa22445#L0R153) pokazuje, że możliwe jest przypisanie mu własności przez 'kwargs' od 5 lat ... – okm

+0

Och, wydaje się, że masz rację - konstruktor obsługuje właściwości; jest to w celu obsługi 'GenericForeignKey'. Jednak drugi argument dotyczący kwerendy jest przechowywany. – koniiiik

Powiązane problemy