Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django如何从ManyToManyField序列化并列出所有_Python_Django_Django Rest Framework_Many To Many_Serialization - Fatal编程技术网

Python Django如何从ManyToManyField序列化并列出所有

Python Django如何从ManyToManyField序列化并列出所有,python,django,django-rest-framework,many-to-many,serialization,Python,Django,Django Rest Framework,Many To Many,Serialization,我正在用Django 1.9.1开发一个移动应用程序后端。我实现了follower模型,现在我想列出一个用户的所有follower,但我目前坚持这样做。我还使用Django Rest框架 这是我的用户配置文件模型 class UserProfile(models.Model): # Linking UserProfile to User model. user = models.OneToOneField(User) city = models.CharField(nul

我正在用Django 1.9.1开发一个移动应用程序后端。我实现了follower模型,现在我想列出一个用户的所有follower,但我目前坚持这样做。我还使用Django Rest框架

这是我的用户配置文件模型

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,但是我不能用它来获取username参数。如果有办法获取参数,我也可以使用ListAPIView作为追随者

如何解决此问题并只列出他们的用户名?
任何帮助都将不胜感激。

我在这个链接中使用了嵌套关系

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

# 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')
输出正是我想要的:

{
“追随者”:[],
“以下内容”:[
{
“用户名”:“斯内德”
},
{
“用户名”:“德罗巴”
}
]

}
我认为您需要的是嵌套序列化程序:

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

field=('followers',)
=>
fields=('followers\uu username',)
?我不知道我可以在field中使用它。我马上就要试试了,我把它改成了field=('followers_u__年龄'),但它仍然给出了它们的ID。顺便说一下,用户名不在UserProfile模型中,而是在UserProfile的OneToOneField用户模型中。我试图列出年龄,因为它直接在用户配置文件中,但它不起作用。很抱歉,它是字段,但我将其视为“字段”。我将其转换为字段,但它给出了此错误。字段名
followers\u age
对于型号
UserProfile
无效。如果我只使用“关注者”,它仍然会给出唯一的ID。哦,对不起,我应该在发布答案之前刷新页面)。哈哈,没关系,时间太近了:D谢谢你的回答:)@ğatayBarın谢谢。非常有用。尤其是您的输出可视化非常有吸引力。