簡體   English   中英

Django如何從ManyToManyField和List All序列化

[英]Django How to Serialize from ManyToManyField and List All

我正在使用Django 1.9.1開發移動應用程序后端我實現了跟隨者模型,現在我想列出用戶的所有關注者,但我現在仍然堅持這樣做。 我也使用Django Rest Framework。

這是我的UserProfile模型

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作為關注者。

如何解決此問題並僅列出其用戶名? 任何幫助將不勝感激。

我認為你需要的是嵌套的序列化器:

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', )

我在這個鏈接中使用了嵌套關系。 Django Rest框架嵌套關系

僅為用戶的用戶名添加了新的序列化程序,並且還更改了其他序列化程序。

# 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" } ] } 

謝謝你的幫助:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM