pip install django-db-views
- add
django_db_viewstoINSTALLED_APPS - use
makeviewmigrationscommand to create migrations for view models
from django_db_views.db_view import DBView
class Balance(DBView):
virtual_card = models.ForeignKey(
VirtualCard, on_delete=models.DO_NOTHING, related_name='virtual_cards'
)
total_discount = models.DecimalField(max_digits=12, decimal_places=2)
total_returns = models.DecimalField(max_digits=12, decimal_places=2)
balance = models.DecimalField(max_digits=12, decimal_places=2)
view_definition = """
SELECT
row_number() over () as id, # Django requires column called id
virtual_card.id as virtual_card_id,
sum(...) as total_discount,
...
"""
class Meta:
managed = False
db_table = 'virtual_card_balance'
- It's using Django code, view-migrations looks like regular migrations.
- It relies on
db_tablenames. makeviewmigrationscommand finds previous migration for view.- if there is no such migration then script create a new migration
- if previous migration exists but no change in
view_definitionis detected nothing is done - if previous migration exists, then script will use previous
view_definitionfor backward operation, and creates new migration.
Tested with live project based on Django 1.11.5