django-database-view icon indicating copy to clipboard operation
django-database-view copied to clipboard

A django pluggable that allows to work with Database views

#################### django-database-view ####################

A simple pluggable application that allows to work with database views.

Quick start

  1. Install the package::

    pip install django-database-view

  2. In your models.py create classes which extend dbview.models.DbView like this:

    .. code-block:: python

    from django.db import models from dbview.models import DbView

    class ModelA(models.Model): fielda = models.CharField(max_length=64) fieldc = models.IntegerField()

    class MyView(DbView): fieldA = models.OneToOneField(ModelA, primary_key=True, on_delete=models.DO_NOTHING, db_column='fielda__id') fieldB = models.IntegerField(blank=True, null=True, db_column='fieldb')

       @classmethod
       def view(cls):
           """
           This method returns the SQL string that creates the view,
           in this example fieldB is the result of annotating another column
           """
           qs = modelA.objects.all(
           ).annotate(
               fieldb=models.Sum('fieldc'),
           ).annotate(
               fielda__id=models.F('pk'),
           ).order_by(
               'fielda__id',
           ).values(
               'fielda__id',
               'fieldb',
           )
           return str(qs.query)
    

    Alternatively get_view_str method could be used to write a custom SQL:

    .. code-block:: python

    class MyView(DbView):
        # ...
    
        @classmethod
        def get_view_str(cls):
            return """
                CREATE VIEW my_view AS (
                SELECT ...
            )"""
    
  3. Then create a migration point for your view generation, edit that migration and modify it, add: from dbview.helpers import CreateView and replace the line the call to migrations.CreateModel with CreateView.

  4. Migrate your database and start using your database views.