Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to store third party apps migrations in django

I'm fairly new to python and django, and trying to build a simple calendar based on django-scheduler package. According to django-scheduler docs, a custom base class can be used to add additional fields, managers and such.

So, I used an abstract model to add a new field:

#myproject/customer_calendar/models.py
from django.db import models
from main.models import Customer

class CalendarAbstract(models.Model):
    customer = models.OneToOneField(to=Customer, null=True, blank=True, related_name='calendar')

    class Meta:
        abstract = True

And added this to settings.py

SCHEDULER_BASE_CLASSES = {
    'Calendar': ['customer_calendar.models.CalendarAbstract'],
}

Now, if I use makemigrations command, a new migration is created inside scheduler app (which is located in site-packages of the current virtual env), which doesn't allow me to keep track of migrations via VCS.

I've found a couple of solutions:

1) Keep the whole scheduler app inside my project. According to SO it' s considered a bad practice and third-party apps should always be retrieved via pip.

2) Use django setting to store all django-scheduler migrations inside my calendar app

MIGRATION_MODULES = {
    'schedule': 'customer_calendar.migrations',
}

The second one looks good to me, but I don't know if it's considered to be a valid solution to this problem. Is there any other ways to store third-party apps migrations?

like image 677
Dmitry Oleinik Avatar asked Nov 07 '17 09:11

Dmitry Oleinik


People also ask

Where are Django migrations stored?

Migrations are generated per app, and are stored in some_app/migrations . Even if you do not define migrations for your apps, there will usually be migrations that take place, since you (likely) included some apps defined by Django (and other third parties) in your INSTALLED_APPS , these have migrations as well.

How does Django keep track of migration?

Django keeps track of applied migrations in the Django migrations table. Django migrations consist of plain Python files containing a Migration class. Django knows which changes to perform from the operations list in the Migration classes. Django compares your models to a project state it builds from the migrations.

What is the difference between Makemigrations and migrate in Django?

migrate , which is responsible for applying and unapplying migrations. makemigrations , which is responsible for creating new migrations based on the changes you have made to your models.


1 Answers

The second one looks good to me, but I don't know if it's considered to be a valid solution to this problem. Is there any other ways to store third-party apps migrations?

As also stated in this answer, FeinCMS docs recommend the use of MIGRATION_MODULES to monitor the migrations of FeinCMS as a third-party app.

FeinCMS itself does not come with any migrations. It is recommended that you add migrations for FeinCMS models yourself inside your project.

...

  • Create a new folder named migrate in your app with an empty init.py inside.

  • Add the following configuration to your settings.py:

    MIGRATION_MODULES = {
         'page': 'yourapp.migrate.page',
         'medialibrary': 'yourapp.migrate.medialibrary', }

You must not use migrations as folder name for the FeinCMS migrations, otherwise Django will get confused.

like image 116
raratiru Avatar answered Sep 21 '22 22:09

raratiru