我有一个扩展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资源的这种实现使得能够获得在当前联系人列表中添加当前用户的用户列表。但我需要一份当前用户的联系人列表。我做错了什么?
答案 0 :(得分:0)
由于contacts
位于UserProfile模型而非User模型,因此关联的资源字段应继续UserProfileResource
而不是UserResource
。
无论如何,我建议将contact
放在自定义用户对象而不是配置文件模型上;如果您将所有内容与User相关联,而不是与与User相关的表相关,它将简化您的代码并保存数据库连接。
答案 1 :(得分:0)
contacts
位于UserProfile
,不在User
且contacts
为User
类型,而非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)
但我不能保证它会起作用。这是唯一的想法。