How to make migrations for a reusable Django app?

后端 未结 3 1900
我在风中等你
我在风中等你 2021-01-02 04:18

I am making a reusable Django app without a project. This is the directory structure:

/
/myapp/
/myapp/models.py
/myapp/migrations/
/myapp/migrations/__init_         


        
相关标签:
3条回答
  • 2021-01-02 04:33

    You need a functional Django project (with your app installed in it) to make migrations.

    A common way to do this is to have a "test" project which contains the bare necessities of a Django project, that you can run to make migrations etc. The migrations will be created in the right place inside your app directory so you can still have proper version control etc within your own reusable app.

    The migrations created in this way will be self-contained (assuming your models don't depend on models from other apps) and can be shipped as part of your packaged, reusable app.

    Many of the larger Django-based projects actually ship a test project as part of their code, so that developers can quickly get it running in order to test apps and make migrations etc.

    0 讨论(0)
  • 2021-01-02 04:49

    Create your_app/migrations_settings.py file:

    SECRET_KEY = 'fake-key'
    
    INSTALLED_APPS = [
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'your_app'
    ]
    

    then

    export DJANGO_SETTINGS_MODULE=yourapp.migrations_settings
    django-admin makemigrations yourapp
    
    0 讨论(0)
  • 2021-01-02 04:55

    Actually, you don't need to have project, all you need is settings file and script, that runs migrations creation. Settings must contain folowing (minimum):

    # test_settings.py
    
    DEBUG = True
    
    SECRET_KEY = 'fake-key'
    
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'your_app'
    ]
    

    And the script, that makes migrations should look like this:

    # make_migrations.py
    
    import os
    import sys
    
    if __name__ == "__main__":
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "test_settings")
        from django.core.management import execute_from_command_line
        args = sys.argv + ["makemigrations", "your_app"]
        execute_from_command_line(args)
    

    and you should run it by python make_migrations.py. Hope it helps someone!

    0 讨论(0)
提交回复
热议问题