Dmitry Oleinik
Dmitry Oleinik

Reputation: 710

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?

Upvotes: 6

Views: 1548

Answers (1)

raratiru
raratiru

Reputation: 9626

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.

Upvotes: 1

Related Questions