TastyPie:ToManyField相关资源

时间:2016-03-26 16:26:13

标签: django tastypie

我有一个扩展Django User模型的模型:

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    avatar = models.CharField(max_length=40, default='0')
    activation_key = models.CharField(max_length=40, blank=True)
    key_expires = models.DateTimeField(default=django.utils.timezone.now)
    contacts = models.ManyToManyField(User, related_name='contacts')

如您所见,有一个字段contacts。通过该字段,每个用户都可以拥有联系人列表(如Skype或社交网络)。 但我想在我的tastypie资源中使用它。我有两个资源:

class UserProfileResource(ModelResource):
    class Meta:
        queryset = UserProfile.objects.all()
        authentication = SessionAuthentication()
        authorization = DjangoAuthorization()
        allowed_methods = ['get']
        resource_name = 'profile'
        excludes = ['id']
        include_resource_uri = False

class UserResource(ModelResource):
    userprofile = fields.ToOneField(UserProfileResource, 'userprofile', null=True, full=True)
    contacts = fields.ToManyField(UserProfileResource, 'contacts', related_name='contacts', null=True, full=True)

    class Meta:
        queryset = User.objects.all()
        fields = ['first_name', 'last_name', 'email', 'date_joined', 'last_login', 'userprofile', 'contacts']
        allowed_methods = ['get', 'post', 'patch']
        resource_name = 'user'
        detail_uri_name = 'username'
        authentication = SessionAuthentication()
        authorization = DjangoAuthorization()

一切都很好,但是当我发出GET请求时,字段联系人不能正常工作。我无法理解,如何在TastyPie资源的联系人字段中显示其他用户的列表。顺便说一下,在Django管理页面中,我可以看到联系人列表,也可以编辑它。

因此,tastypie资源的这种实现使得能够获得在当前联系人列表中添加当前用户的用户列表。但我需要一份当前用户的联系人列表。我做错了什么?

2 个答案:

答案 0 :(得分:0)

由于contacts位于UserProfile模型而非User模型,因此关联的资源字段应继续UserProfileResource而不是UserResource

无论如何,我建议将contact放在自定义用户对象而不是配置文件模型上;如果您将所有内容与User相关联,而不是与与User相关的表相关,它将简化您的代码并保存数据库连接。

答案 1 :(得分:0)

contacts位于UserProfile,不在UsercontactsUser类型,而非UserProfile

contacts = fields.ToManyField(UserResource, 'userprofile__contacts', related_name='contacts', null=True, full=True)

如果您确实需要UserProfile,请尝试:

contacts = fields.ToManyField(UserProfileResource, 'userprofile__contacts__userprofile', related_name='contacts', null=True, full=True)

但我不能保证它会起作用。这是唯一的想法。