在django中,我有两个模型 - User和UserProfile。特定用户可能存在零个或一个配置文件。我正在尝试将UserProfile模型中的信息直接包含在UserResource中。
我想使用配置文件ToManyField(如果存在)来访问关联的UserProfile模型的内容。我已经尝试了各种脱水方法,包括self.profile.get_related_resource(self)和UserProfile.objects.get(id = ...),但我似乎找不到从配置文件字段到模型对象。有人可以帮帮我吗?
我还是Python,Django和Tastypie的新手,所以如果我做任何可怕的事情,有人会非常友好地指出它。
目标是让JSON看起来像这样: { resourceUri:/ v1 / users / 1 date_of_birth:1980年1月1日 ......等 }
其中date_of_birth是UserProfileResource的属性。我不想要UserProfileResource的所有字段,我不希望UserProfile成为响应中的嵌套对象 - 我希望UserProfileResource中的某些字段成为响应中的顶级字段,这样它们看起来像用户资源的一部分。
class UserResource(ModelResource):
profile = fields.ToOneField('foo.api.UserProfileResource', 'user', null=True)
class Meta:
queryset = User.objects.all()
resource_name = 'users'
allowed_methods = ['get']
#etc...
class UserProfileResource(ModelResource):
date_of_birth = ...
#etc
答案 0 :(得分:1)
我假设您正在使用Django 1.4和AUTH_PROFILE_MODULE
?
由于User:UserProfile关系是1:1,我会选择ToOneField。这将序列化为指向UserProfileResource的URI指针(如果存在)。如果您希望UserRrofileResource字段数据与UserResource内联,则可以在ToOneField定义中指定full=True
。使用此方法,您不需要覆盖脱水。
此外,确保ToOneField定义中的第二个参数是指向UserProfile Django模型的User属性。例如,如果您的Django模型中有OneToOneField(User, related_name='profile')
,则此属性应为profile
。
class UserResource(ModelResource):
profile = fields.ToOneField('foo.api.UserProfileResource', 'profile',
full=True, null=True)
class Meta:
queryset = User.objects.all()
resource_name = 'users'
allowed_methods = ['get']
如果你所追求的是与用户混合的UserProfile实例中的特定字段,你应该能够做到这样的事情:
class UserResource(ModelResource):
date_of_birth = fields.DateField('profile__date_of_birth', null=True)
class Meta:
queryset = User.objects.all()
resource_name = 'users'
allowed_methods = ['get']
fields = ['userfields', 'gohere', 'date_of_birth']