2010-06-16 16 views
12

Jeden z moich modeli django ma duży TextField, którego często nie potrzebuję używać. Czy istnieje sposób, aby powiedzieć django, aby "leniwy załadować" to pole? tzn. nie zawracać sobie głowy wyciąganiem go z bazy danych, chyba że wyraźnie o to poprosię. Tracę dużo pamięci i przepustowości, ciągnąc to TextField do Pythona za każdym razem, gdy odwołuję się do tych obiektów.Czy django może leniwym załadować pola w modelu?

Alternatywą byłoby utworzenie nowej tabeli zawartości tego pola, ale wolałbym uniknąć tej złożoności, jeśli mogę.

Odpowiedz

11

Funkcjonalność dzieje się podczas wykonywania kwerendy, używając instrukcji defer(), zamiast w definicji modelu. Sprawdź to tutaj w dokumentach: http://docs.djangoproject.com/en/dev/ref/models/querysets/#defer

Teraz, faktycznie, twoje alternatywne rozwiązanie refaktoryzacji i wciągnięcia danych do innego stołu jest naprawdę dobrym rozwiązaniem. Niektórzy powiedzieliby, że potrzeba leniwych pól ładowania oznacza wadę projektu, a dane powinny zostać zamodelowane w inny sposób.

Tak czy inaczej działa!

5

Po coś takiego można po prostu zastąpić domyślnego menedżera. Zazwyczaj to nie poradził, ale na odroczenie() ma sens:

class CustomManager(models.Manager): 
     def get_queryset(self): 
      return super(CustomManager, self).get_queryset().defer('YOUR_TEXTFIELD_FIELDNAME') 

    class DjangoModel(models.Model): 
     objects = CustomerManager() 
5

w Django Istnieją dwie opcje dla leniwych-załadunku: https://docs.djangoproject.com/en/1.6/ref/models/querysets/#django.db.models.query.QuerySet.only

  • Defer (* Pola)

    Unikaj ładowania tych pól, które wymagają kosztownego przetwarzania, aby przekonwertować je na obiekty Pythona.

    Entry.objects.defer("text")

  • tylko (* Pola)

    załadować tylko te pola, które faktycznie potrzebują

    Person.objects.only("name")

    Osobiście uważam only jest lepsza niż defer ponieważ kod nie jest tylko łatwiejsze do zrozumienia, ale także łatwiejsze w utrzymaniu.

Powiązane problemy