¿Puede django cargar campos en un modelo?

Uno de mis modelos de django tiene un TextField grande que a menudo no necesito usar. ¿Hay alguna manera de decirle a django que “cargue de forma perezosa” este campo? es decir, no molestar en extraerlo de la base de datos a menos que lo solicite explícitamente. Estoy perdiendo una gran cantidad de memoria y ancho de banda tirando de este TextField en python cada vez que me refiero a estos objetos.

La alternativa sería crear una nueva tabla para los contenidos de este campo, pero preferiría evitar esa complejidad si puedo.

La funcionalidad sucede cuando realiza la consulta, utilizando la statement defer() , en lugar de en la definición del modelo. Compruébelo aquí en la documentación: http://docs.djangoproject.com/en/dev/ref/models/querysets/#defer

Ahora, en realidad, su solución alternativa de refactorización y extracción de datos en otra tabla es una solución realmente buena. Algunas personas dirían que la necesidad de campos de carga diferida significa que hay una falla de diseño, y los datos deberían haberse modelado de manera diferente.

¡De cualquier manera funciona, sin embargo!

Para algo como esto, puede anular el administrador predeterminado. Por lo general, no se recomienda, pero para un aplazamiento () tiene sentido:

  class CustomManager(models.Manager): def get_queryset(self): return super(CustomManager, self).get_queryset().defer('YOUR_TEXTFIELD_FIELDNAME') class DjangoModel(models.Model): objects = CustomerManager() 

Hay dos opciones para la carga lenta en Django: https://docs.djangoproject.com/en/1.6/ref/models/querysets/#django.db.models.query.QuerySet.only

  • aplazar (* campos)

    Evite cargar aquellos campos que requieren un procesamiento costoso para convertirlos en objetos de Python.

    Entry.objects.defer("text")

  • solo (* campos)

    Solo carga los campos que realmente necesites

    Person.objects.only("name")

    Personalmente, creo que only es mejor que defer ya que el código no solo es más fácil de entender, sino también más fácil de mantener a largo plazo.