首页 > 解决方案 > AttributeError:混合器(dashboard.ContactQueue):类型对象“JSONField”没有属性“_meta”

问题描述

我正在使用mixer模块来创建测试对象。下面是模型类。

class ContactQueue(models.Model):
    arn = models.CharField(max_length=255)
    queue_id = models.CharField(max_length=50)
    queue_type = models.CharField(max_length=25)
    name = models.CharField(max_length=25, null=True)
    description = models.TextField(null=True)
    outbound_caller_config = models.JSONField()
    hours_of_operation_id = models.CharField(max_length=50)
    status = models.CharField(
        max_length=10,
        choices=(
            ('ENABLED', 'ENABLED'),
            ('DISABLED', 'DISABLED'),
        )
    )

这是我写的测试用例。

class TestContactQueue:
    def test_model(self):
        obj = mixer.blend("dashboard.ContactQueue")
        assert obj.pk == 1, "Should create a ContactQueue instance"

在运行测试时,我得到了这个错误。

__________________________________________________________________ TestContactQueue.test_model ___________________________________________________________________

self = <dashboard.tests.test_models.TestContactQueue object at 0x000002329C1C8548>

    def test_model(self):
>       obj = mixer.blend("dashboard.ContactQueue")

dashboard\tests\test_models.py:21:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
..\venv\lib\site-packages\mixer\main.py:568: in blend
    return type_mixer.blend(**values)
..\venv\lib\site-packages\mixer\main.py:116: in blend
    for name, value in defaults.items()
..\venv\lib\site-packages\mixer\main.py:113: in <genexpr>
    value.gen_value(self, name, value)
..\venv\lib\site-packages\mixer\mix_types.py:229: in gen_value
    return type_mixer.gen_field(field)
..\venv\lib\site-packages\mixer\backend\django.py:273: in gen_field
    return super(TypeMixer, self).gen_field(field)
..\venv\lib\site-packages\mixer\main.py:193: in gen_field
    return self.gen_value(field.name, field, unique=unique)
..\venv\lib\site-packages\mixer\main.py:238: in gen_value
    fab = self.get_fabric(field, field_name, fake=fake)
..\venv\lib\site-packages\mixer\main.py:282: in get_fabric
    self.__fabrics[key] = self.make_fabric(field.scheme, field_name, fake)
..\venv\lib\site-packages\mixer\backend\django.py:330: in make_fabric
    fcls, field_name=fname, fake=fake, kwargs=kwargs)
..\venv\lib\site-packages\mixer\main.py:301: in make_fabric
    factory=self.__factory).blend, **kwargs)
..\venv\lib\site-packages\mixer\main.py:55: in __call__
    cls_type, mixer=mixer, factory=factory, fake=fake)
..\venv\lib\site-packages\mixer\main.py:88: in __init__
    self.__fields = _.OrderedDict(self.__load_fields())
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <TypeMixer <class 'django.db.models.fields.json.JSONField'>>

    def __load_fields(self):
>       private_fields = getattr(self.__scheme._meta, 'private_fields', [])
E       AttributeError: Mixer (dashboard.ContactQueue): type object 'JSONField' has no attribute '_meta'

..\venv\lib\site-packages\mixer\backend\django.py:389: AttributeError
----------------------------------------------------------------------- Captured log call ------------------------------------------------------------------------
ERROR    mixer:main.py:574 Traceback (most recent call last):
  File "c:\users\aman\desktop\my_project\venv\lib\site-packages\mixer\main.py", line 568, in blend
    return type_mixer.blend(**values)
  File "c:\users\aman\desktop\my_project\venv\lib\site-packages\mixer\main.py", line 116, in blend
    for name, value in defaults.items()
  File "c:\users\aman\desktop\my_project\venv\lib\site-packages\mixer\main.py", line 113, in <genexpr>
    value.gen_value(self, name, value)
  File "c:\users\aman\desktop\my_project\venv\lib\site-packages\mixer\mix_types.py", line 229, in gen_value
    return type_mixer.gen_field(field)
  File "c:\users\aman\desktop\my_project\venv\lib\site-packages\mixer\backend\django.py", line 273, in gen_field
    return super(TypeMixer, self).gen_field(field)
  File "c:\users\aman\desktop\my_project\venv\lib\site-packages\mixer\main.py", line 193, in gen_field
    return self.gen_value(field.name, field, unique=unique)
  File "c:\users\aman\desktop\my_project\venv\lib\site-packages\mixer\main.py", line 238, in gen_value
    fab = self.get_fabric(field, field_name, fake=fake)
  File "c:\users\aman\desktop\my_project\venv\lib\site-packages\mixer\main.py", line 282, in get_fabric
    self.__fabrics[key] = self.make_fabric(field.scheme, field_name, fake)
  File "c:\users\aman\desktop\my_project\venv\lib\site-packages\mixer\backend\django.py", line 330, in make_fabric
    fcls, field_name=fname, fake=fake, kwargs=kwargs)
  File "c:\users\aman\desktop\my_project\venv\lib\site-packages\mixer\main.py", line 301, in make_fabric
    factory=self.__factory).blend, **kwargs)
  File "c:\users\aman\desktop\my_project\venv\lib\site-packages\mixer\main.py", line 55, in __call__
    cls_type, mixer=mixer, factory=factory, fake=fake)
  File "c:\users\aman\desktop\my_project\venv\lib\site-packages\mixer\main.py", line 88, in __init__
    self.__fields = _.OrderedDict(self.__load_fields())
  File "c:\users\aman\desktop\my_project\venv\lib\site-packages\mixer\backend\django.py", line 389, in __load_fields
    private_fields = getattr(self.__scheme._meta, 'private_fields', [])
AttributeError: Mixer (dashboard.ContactQueue): type object 'JSONField' has no attribute '_meta'

标签: pythondjangopytest

解决方案


您必须明确设置模型中的所有 JSON 字段,如果您不这样做,混合将对其进行迭代并检查它们的 _meta 属性


推荐阅读