How to create table during Django tests with managed = False

前端 未结 9 1941
执笔经年
执笔经年 2020-12-24 12:25

I have a model with managed = False.

class SampleModel(models.Model):
    apple = models.CharField(max_length=30)
    orange = models.CharField(max_length=3         


        
9条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-24 12:44

    You can use SchemaEditor in TestCase.setUp method to explicitly create models with managed = False.

    # models.py
    
    from django.db import models
    
    
    class Unmanaged(models.Model):
        foo = models.TextField()
    
        class Meta:
            # This model is not managed by Django
            managed = False
            db_table = 'unmanaged_table'
    

    And in your tests:

    # tests.py
    
    from django.db import connection
    from django.test import TestCase
    
    from myapp.models import Unmanaged
    
    
    class ModelsTestCase(TestCase):
        def setUp(self):
            super().setUp()
    
            with connection.schema_editor() as schema_editor:
                schema_editor.create_model(Unmanaged)
    
                if Unmanaged._meta.db_table not in connection.introspection.table_names():
                    raise ValueError("Table `{table_name}` is missing in test database.".format(table_name=Unmanaged._meta.db_table))
    
        def tearDown(self):
            super().tearDown()
    
            with connection.schema_editor() as schema_editor:
                schema_editor.delete_model(Unmanaged)
    
        def test_unmanaged_model(self):
            with self.assertNumQueries(num=3):
                self.assertEqual(0, Unmanaged.objects.all().count())
                Unmanaged.objects.create()
                self.assertEqual(1, Unmanaged.objects.all().count())
    

提交回复
热议问题