当使用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'是我的应用程序的名称
答案 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
和项目文件夹结构。