tastypie-模型''具有空属性

时间:2014-05-15 05:46:37

标签: python django tastypie

当使用fields.ToManyField()做反向关系时,我遇到以下错误

http://localhost:8080/api/v1/environment_test_device/?format=json

我正在看

The model '' has an empty attribute 'device_type_set' and doesn't allow a null value.

我想知道为什么模型是''。我猜我的api路径设置不正确。有没有办法验证文件的路径是否正确或为什么我收到此错误?我真的不明白应该调用什么'device_type_set'。我看着http://django-tastypie.readthedocs.org/en/latest/fields.html#tastypie.fields.RelatedField.related_name,但“author_set”确实与给定的示例中的任何内容都不对应

我的模特是

class DeviceType(models.Model):
    device_type_id = models.AutoField(primary_key=True)
    device_name = models.CharField(max_length=255, unique=True)
    class Meta:
        db_table = u'device_type'

class Environment(models.Model):
    environment_id = models.AutoField(primary_key=True)
    environment_name = models.CharField(max_length=255, unique=True)
    class Meta:
        db_table = u'environment'

class Test(models.Model):
    test_id = models.AutoField(primary_key=True)
    test_name = models.CharField(max_length=255, unique=True)
    class Meta:
        db_table = u'test'

class EnvironmentTestDevice(models.Model):
    environment_test_device_id = models.IntegerField(primary_key=True)
    environment = models.ForeignKey(Environment)
    test = models.ForeignKey(Test)
    device_type = models.ForeignKey(DeviceType)
    class Meta:
        db_table = u'environment_test_device'

我的api.py是

class DeviceTypeResource(ModelResource):
    environment_test_device = fields.ToManyField('resources.EnvironmentTestDeviceResource', 'device_type_set', related_name = 'device_type', full=True)
    class Meta:
        queryset = DeviceType.objects.all()
        authorization = Authorization()
        resource_name = 'device_type'

class EnvironmentResource(ModelResource):
    class Meta:
        queryset = Environment.objects.all()
        authorization = Authorization()
        resource_name = 'environment'

class TestResource(ModelResource):
    class Meta:
        queryset = Test.objects.all()
        authorization = Authorization()
        resource_name = 'test'

class EnvironmentTestDeviceResource(ModelResource):
    device_type = fields.ForeignKey(DeviceTypeResource, 'device_type', full=True, null=True)
    test = fields.ForeignKey(TestResource, 'test', full=True, null=True)
    environment = fields.ForeignKey(EnvironmentResource, 'environment', full=True, null=True)

    class Meta:
        queryset = PipelineTestDevice.objects.all()
        authorization = Authorization()
        resource_name = 'environment_test_device'

在以下一行的旁注中

 environment_test_device = fields.ToManyField('resources.EnvironmentTestDeviceResource', 'device_type_set', related_name = 'device_type', full=True)

我已经评论过它我能够找回正确的json响应,但我假设我需要反向关系。我也尝试将'resources.EnvironmentTestDeviceResource'设置为 'project.api.resources.EnvironmentTestDeviceResource'和'project.api.EnvironmentTestDeviceResource'并收到相同的错误响应。 'project'是我的应用程序的名称

1 个答案:

答案 0 :(得分:0)

我认为问题是属性的名称。使用devicetype_set代替device_type_set。但你应该在Django shell中测试它。这里enter link description here< - 有一条说明Django根据小写类名创建reversed_name名称:

DeviceType变为devicetype + _set

编辑您的评论

文档说它应该是资源的路径。如果它在同一个文件中,我会使用这个表格:

environment_test_device = fields.ToManyField('EnvironmentTestDeviceResource', 'devicetype_set', related_name = 'device_type', full=True)

如果这不起作用,你应该尝试使用绝对路径来查看你的INSTALLED_APPS和项目文件夹结构。

Documentation