2

我正在开发与Django 1.9.1的移动应用程序后端我实现了跟随者模型,现在我想列出用户的所有追随者,但我目前坚持去做。我也使用Django Rest Framework。Django如何序列化从ManyToManyField和列表全部

这是我的用户配置模型

class UserProfile(models.Model): 
# Linking UserProfile to User model. 
user = models.OneToOneField(User) 
city = models.CharField(null=True, max_length=30, blank=True) 
gender = models.CharField(null=True, max_length=10, blank=True) # m for male, f for female 
# TODO: Fix the picture later. 
# picture = models.ImageField(upload_to='profile_images', blank=True) 
age = models.IntegerField(null=True, blank=True) 
caption = models.CharField(null=True, max_length=40, blank=True) 
following_count = models.IntegerField(default=0) 
follower_count = models.IntegerField(default=0) 
post_count = models.IntegerField(default=0) 
like_count = models.IntegerField(default=0) 
date = models.DateTimeField(default=datetime.now(), blank=True) 
is_protected = models.BooleanField(default=False) 
is_facebook_created_user = models.BooleanField(default=False) 
facebook_id = models.CharField(default='', blank=True, max_length=350) 
picture_url = models.URLField(blank=True, max_length=100, null=True) 
followings = models.ManyToManyField('self', related_name='following', symmetrical=False) 
followers = models.ManyToManyField('self', related_name='follower', symmetrical=False) 
blocking = models.ManyToManyField('self', related_name='block', symmetrical=False) 
blocked_by = models.ManyToManyField('self', related_name='blocked', symmetrical=False) 

def block_user(self,username): 
     other = UserProfile.objects.get(user__username=username) 
     if not self.is_blocking(username): 
      self.blocking.add(other) 
      other.blocked_by.add(self) 
      return True 
     else: 
      return False 

def unblock_user(self, username): 
     other = UserProfile.objects.get(user__username=username) 
     if self.is_blocking(username): 
      self.blocking.remove(other) 
      other.blocked_by.remove(self) 
      return True 
     else: 
      return False 

def follow_user(self, username): 
     other = UserProfile.objects.get(user__username=username) 
     if not self.is_following(username): 
      self.followings.add(other) 
      self.following_count = self.followings.all().count() 
      self.save() 
      other.followers.add(self) 
      other.follower_count = other.followers.all().count() 
      other.save() 
      return True 
     else: 
      return False 

def unfollow_user(self, username): 
     other = UserProfile.objects.get(user__username=username) 
     if self.is_following(username): 
      self.followings.remove(other) 
      self.following_count = self.followings.all().count() 
      self.save() 
      other.followers.remove(self) 
      other.follower_count = other.followers.all().count() 
      other.save() 
      return True 
     else: 
      return False 

def is_blocking(self,username): 
    return self.blockings.all().filter(user__username=username).exists() 

def is_blocked_by(self,username): 
    return self.blocked_by.all().filter(user__username=username).exists() 

def is_following(self, username): #returns Bool 
    return self.followings.all().filter(user__username=username).exists() 

def is_followed_by(self, username): #returns Bool 
    return self.followers.all().filter(user__username=username).exists() 

def __unicode__(self): 
    return self.user.username 

def get_token(self): 
    try: 
     token = Token.objects.get(user_id=self.user_id) 
    except: 
     token = 'error' 
    return token 
def get_username(self): 
    return self.user.username 

正如你看到的,我的用户ManyToManyField追随者。现在我想列出用户的关注者,但我不想列出他们所有的信息,因为这是不必要的。我只想列出他们的用户名,因为不需要全部信息,这只是一种浪费。

这是我的粉丝视图。

@api_view(['GET']) 
def get_followers(request): 
username = request.query_params.get('username', None) 
if username is not None: 
    if  UserProfile.objects.all().filter(user__username=username).exists(): 
     wanted = UserProfile.objects.get(user__username=username) 
     followers = wanted.followers.all() 
     serializer = FollowerSerializer(followers) 
     return JsonResponse(serializer.data) 
    else: 
     return JsonResponse({"result": "user_does_not_exist"}) 
else: 
    #TODO: return current user's followers 
    return JsonResponse({"result": "provide_username"}) 

此外,我只为用户的追随者添加了一个序列化程序。

class FollowerSerializer(serializers.ModelSerializer): 
class Meta: 
    model = UserProfile 
    field = ('followers',) 

的问题是,它只是列出了所有的用户信息,并没有给用户名,但只列出了相应的ID,我不能做任何事情。

我忘了提及,我确实想过使用ListAPIView,但我无法获得用户名参数。如果有一种获取参数的方法,我也可以为追随者使用ListAPIView。

我该如何解决这个问题并列出他们的用户名? 任何帮助将不胜感激。

+1

'field =('followers',)'=>'fields =('followers__username',)'? –

+0

我不知道我可以在现场使用它。我会在一分钟内尝试它 –

+0

我将它改为field =('followers__age',)但它仍然给出它们的ID。顺便说一句,用户名不是在UserProfile模型中,而是在用户模型中是UserProfile的OneToOneField。我试图列出年龄,因为它直接在UserProfile中,但它不起作用 –

回答

2

我想你需要的是嵌套串行:

class FollowerSerializer(serializers.ModelSerializer): 
    username = serializers.CharField(source='user__username') 

    class Meta: 
     model = UserProfile 
     fields = ('username',) 


class FollowerSerializer(serializers.ModelSerializer): 
    followers = FollowerSerializer(many=True, read_only=True) 

    class Meta: 
     model = UserProfile 
     fields = ('followers',) 
0

我在这个链接中使用了嵌套关系。 Django Rest Framework Nested Relationships

仅为用户的用户名添加了新的序列化程序,并且还更改了其他序列化程序。

# serializes only usernames of users 
class EachUserSerializer(serializers.ModelSerializer): 
username = serializers.CharField(source='user.username') 
class Meta: 
    model = UserProfile 
    fields = ('username',) 

class FollowerSerializer(serializers.ModelSerializer): 
followers = EachUserSerializer(many=True, read_only= True) 
followings = EachUserSerializer(many=True,read_only=True) 
class Meta: 
    model = UserProfile 
    fields = ('followers','followings') 

输出正是我在找的是:

{ 
 
    "followers": [], 
 
    "followings": [ 
 
    { 
 
     "username": "sneijder" 
 
    }, 
 
    { 
 
     "username": "drogba" 
 
    } 
 
    ] 
 
}

谢谢你的帮助呢:)

+0

哦,对不起,我应该在发布答案之前刷新页面)。 –

+0

哈哈没关系,时间太近了:D谢谢你的回答:) –

相关问题