【问题标题】:Django fixtures and AttributeError: 'QuerySet' object has no attribute <custom_model_method>Django 固定装置和 AttributeError:'QuerySet' 对象没有属性 <custom_model_method>
【发布时间】:2014-12-25 13:37:43
【问题描述】:

我在一个简单的集成测试中看到了这个错误。 django 应用程序名为storageadmin,模型名为Disk,自定义模型方法名为pool_name。我正在使用 South 和 django rest 框架,并且在 settings.py 中有 SOUTH_TESTS_MIGRATE = False

夹具是用这个命令创建的。默认数据库在 dumpdata 之前由应用程序填充了一些模型,足以进行测试。

./bin/django dumpdata storageadmin oauth2_provider auth.User --indent=2 &gt; src/rockstor /storageadmin/fixtures/storageadmin.json

错误与以下模型有关

class Disk(models.Model):
    pool = models.ForeignKey(Pool, null=True, on_delete=models.SET_NULL)
    name = models.CharField(max_length=10, unique=True)    

def pool_name(self, *args, **kwargs):
    try:
        return self.pool.name
    except:
        return None

class Meta:
    app_label = 'storageadmin'

有一个序列化器用于在视图中发送响应

class DiskInfoSerializer(serializers.ModelSerializer):
    pool_name = serializers.CharField(source='pool_name')

    class Meta:
        model = Disk

视图返回这样的响应

ds = DiskInfoSerializer(Disk.objects.all())
return Response(ds.data)

编辑:如正确答案所示,问题出在上述视图中。我使用的是非常旧的 DRF(2.1.15),但当前正在测试的版本(2.4.3)需要 ds = DiskInfoSerializer(Disk.objects.all(), many=True)

触发错误的简单测试用例是:

class DiskTests(APITestCase):
    fixtures = ['storageadmin.json']
    BASE_URL = '/api/disks/scan'

    def test_disk_scan(self):
        self.client.login(username='admin', password='admin')
        response = self.client.post(self.BASE_URL, data=None, format='json')
        self.assertEqual(response.status_code, status.HTTP_200_OK)

最后,错误是

File "/opt/rock-dep/src/rockstor/storageadmin/views/disk.py", line 88, in _scan
    return Response(ds.data)
File "/opt/rock-dep/eggs/djangorestframework-2.4.3-py2.7.egg/rest_framework   /serializers.py", line 572, in data
    self._data = self.to_native(obj)
File "/opt/rock-dep/eggs/djangorestframework-2.4.3-py2.7.egg/rest_framework/serializers.py", line 351, in to_native
    value = field.field_to_native(obj, field_name)
File "/opt/rock-dep/eggs/djangorestframework-2.4.3-py2.7.egg/rest_framework/fields.py", line 336, in field_to_native
    return super(WritableField, self).field_to_native(obj, field_name)
File "/opt/rock-dep/eggs/djangorestframework-2.4.3-py2.7.egg/rest_framework/fields.py", line 207, in field_to_native
    value = get_component(value, component)
File "/opt/rock-dep/eggs/djangorestframework-2.4.3-py2.7.egg/rest_framework/fields.py", line 58, in get_component
    val = getattr(obj, attr_name)
AttributeError: 'QuerySet' object has no attribute 'pool_name'

代码工作正常,问题只是在测试时。

【问题讨论】:

    标签: python django django-rest-framework django-fixtures


    【解决方案1】:

    就像错误所说的那样,您正在传递一个查询集,但您并没有告诉 DRF 这就是您正在做的事情。你需要通过many=True:

    ds = DiskInfoSerializer(Disk.objects.all(), many=True)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-19
      • 2016-11-20
      • 2019-07-10
      • 2020-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      相关资源
      最近更新 更多