Django tastypie 反向关系不起作用
Django tastypie reverse relation not working
我有以下 OneToOne 映射到用户的 CustomerProfile 模型 table :
class CustomerProfile(models.Model):
'''Profile details of the customers. All extra details are mentioned
here.'''
user = models.OneToOneField(User, related_name='profile')
phone = models.CharField(max_length=200, null=True, blank=True)
class Meta:
app_label = 'testapp'
def __unicode__(self):
return unicode(self.user)
我使用 Tastpye 框架创建了 REST API,并遵循 resource.py 来获取用户及其个人资料详细信息
class UserResource(ModelResource):
'''Fetch user details'''
class Meta:
queryset = User.objects.all()
resource_name = 'user'
include_resource_uri = False
allowed_methods = ['get']
excludes = ['password','last_login','is_superuser','is_staff','date_joined']
filtering = {
'id': ['exact'],
'username': ['exact']
}
class CustomerProfileResource(ModelResource):
'''Fetch customer details and all coupons'''
class Meta:
queryset = CustomerProfile.objects.all()
resource_name = 'customer'
include_resource_uri = False
allowed_methods = ['get']
现在我想要的是通过单个 API 调用 (/user) 的用户也将能够获取其个人资料详细信息。谁能告诉我怎么做。
仅供参考,我在 UserResource class 中添加了以下代码来实现此目的:
profile = fields.ToManyField('coin.api.CustomerProfileResource', 'profile', null=True, full=True)
但是我收到了这个错误:
{"error_message": "'CustomerProfile' object has no attribute 'all'", "traceback": "Traceback (most recent call last):\n\n File \"/home/rajeev/projects/bitbucket/coin/env/local/lib/python2.7/site-packages/tastypie/resources.py\", line 195, in wrapper\n response = callback(request, *args, **kwargs)
为了实现这一点,我进行了很多冲浪,但还没有找到任何可以实现所需输出的方法。请提出一些解决方案。
CustomerProfile 以一对一的关系绑定到 User,因此您应该在 UserResource:
中使用 fields.OneToOneField
class UserResource(ModelResource):
'''Fetch user details'''
custom_profile = fields.OneToOneField(CustomerProfileResource, 'custom_profile', related_name='profile', full=True)
class Meta:
fields = ['id', 'username', 'custom_profile'] # other fields what you need
...
幸运的是我通过点击和试验得到了答案:)
由于 CustomerProfile 资源通过 OneToOne 映射映射到 UserResouce,因此我们必须使用 fields.ToOneField 而不是 fields.ToManyField,同时从 UserResource 进行反向关系,如下所示:
profile = fields.ToOneField('coin.api.CustomerProfileResource', 'profile', null=True, full=True)
不过,如果有人能把资源映射和反向映射说清楚,那对大家还是很有帮助的,显然django官方文档帮不了我太多。
谢谢
我有以下 OneToOne 映射到用户的 CustomerProfile 模型 table :
class CustomerProfile(models.Model):
'''Profile details of the customers. All extra details are mentioned
here.'''
user = models.OneToOneField(User, related_name='profile')
phone = models.CharField(max_length=200, null=True, blank=True)
class Meta:
app_label = 'testapp'
def __unicode__(self):
return unicode(self.user)
我使用 Tastpye 框架创建了 REST API,并遵循 resource.py 来获取用户及其个人资料详细信息
class UserResource(ModelResource):
'''Fetch user details'''
class Meta:
queryset = User.objects.all()
resource_name = 'user'
include_resource_uri = False
allowed_methods = ['get']
excludes = ['password','last_login','is_superuser','is_staff','date_joined']
filtering = {
'id': ['exact'],
'username': ['exact']
}
class CustomerProfileResource(ModelResource):
'''Fetch customer details and all coupons'''
class Meta:
queryset = CustomerProfile.objects.all()
resource_name = 'customer'
include_resource_uri = False
allowed_methods = ['get']
现在我想要的是通过单个 API 调用 (/user) 的用户也将能够获取其个人资料详细信息。谁能告诉我怎么做。
仅供参考,我在 UserResource class 中添加了以下代码来实现此目的:
profile = fields.ToManyField('coin.api.CustomerProfileResource', 'profile', null=True, full=True)
但是我收到了这个错误:
{"error_message": "'CustomerProfile' object has no attribute 'all'", "traceback": "Traceback (most recent call last):\n\n File \"/home/rajeev/projects/bitbucket/coin/env/local/lib/python2.7/site-packages/tastypie/resources.py\", line 195, in wrapper\n response = callback(request, *args, **kwargs)
为了实现这一点,我进行了很多冲浪,但还没有找到任何可以实现所需输出的方法。请提出一些解决方案。
CustomerProfile 以一对一的关系绑定到 User,因此您应该在 UserResource:
中使用 fields.OneToOneFieldclass UserResource(ModelResource):
'''Fetch user details'''
custom_profile = fields.OneToOneField(CustomerProfileResource, 'custom_profile', related_name='profile', full=True)
class Meta:
fields = ['id', 'username', 'custom_profile'] # other fields what you need
...
幸运的是我通过点击和试验得到了答案:)
由于 CustomerProfile 资源通过 OneToOne 映射映射到 UserResouce,因此我们必须使用 fields.ToOneField 而不是 fields.ToManyField,同时从 UserResource 进行反向关系,如下所示:
profile = fields.ToOneField('coin.api.CustomerProfileResource', 'profile', null=True, full=True)
不过,如果有人能把资源映射和反向映射说清楚,那对大家还是很有帮助的,显然django官方文档帮不了我太多。
谢谢