首页 > 解决方案 > Django 测试导入使用来自真实数据库的内容类型值

问题描述

我的应用程序建立在 Django 和 DRF 之上。我正在尝试测试具有类似于此结构的序列化程序:

设置.py

...
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db',
        'USER': 'user',
        'PASSWORD': 'unbreakablepass',
        'TEST': {
            'NAME': 'test_db',
        }
    }
}
...

模型.py

class Status(models.Model):
    name = models.CharField(verbose_name=_('name'), max_length=150)
    order = models.PositiveIntegerField(verbose_name=_('order'), default=0)
    content_type = models.ForeignKey(ContentType)

class Task(models.Model):
    status = models.ForeignKey(Status)

序列化程序.py

class TaskSerializer(serializers.ModelSerializer):
    class Meta:
        model = Task
        fields = ['status']
        extra_kwargs = {
            'status': {
                'queryset': Status.objects.filter(
                    content_type=ContentType.objects.get_for_model(Task)
                )
            }
        }


测试.py

from myapp.serializers import TaskSerializer
from myapp.models import Task

class TaskTestCase(TestCase):
    def test_content_type(self):
        # Do something with ContentType.objects.get_for_model(Task)
        ...

我的问题是,由于序列化程序是在 中导入的tests.py,因此它们是在我运行时设置测试数据库之前导入的manage.py test --keepdbqueryset现在,我的相关字段属性中的 ContentType 值使用ContentType来自主数据库的值进行过滤,而不是测试数据库。因此,如果他们尝试使用相关字段中的任何值,我的测试将失败。

显而易见的选择似乎是:

关于如何做到这一点有什么好的做法吗?

标签: pythondjangotestingdjango-rest-framework

解决方案


推荐阅读