Django: How to create a model dynamically just for testing

后端 未结 11 840
鱼传尺愫
鱼传尺愫 2020-12-02 05:15

I have a Django app that requires a settings attribute in the form of:

RELATED_MODELS = (\'appname1.modelname1.attribute1\',
                  \         


        
11条回答
  •  执念已碎
    2020-12-02 05:56

    Here's the pattern that I'm using to do this.

    I've written this method that I use on a subclassed version of TestCase. It goes as follows:

    @classmethod
    def create_models_from_app(cls, app_name):
        """
        Manually create Models (used only for testing) from the specified string app name.
        Models are loaded from the module ".models"
        """
        from django.db import connection, DatabaseError
        from django.db.models.loading import load_app
    
        app = load_app(app_name)
        from django.core.management import sql
        from django.core.management.color import no_style
        sql = sql.sql_create(app, no_style(), connection)
        cursor = connection.cursor()
        for statement in sql:
            try:
                cursor.execute(statement)
            except DatabaseError, excn:
                logger.debug(excn.message)
                pass
    

    Then, I create a special test-specific models.py file in something like myapp/tests/models.py that's not included in INSTALLED_APPS.

    In my setUp method, I call create_models_from_app('myapp.tests') and it creates the proper tables.

    The only "gotcha" with this approach is that you don't really want to create the models ever time setUp runs, which is why I catch DatabaseError. I guess the call to this method could go at the top of the test file and that would work a little better.

提交回复
热议问题