django -rest-framework получение подписчиков с помощью related_name из ManyToManyField - PullRequest
0 голосов
/ 28 мая 2020

Итак, я создаю систему последователей, но есть проблема. Все исправно работает. но в последовательном сериализаторе мне нужны имя пользователя и другие сведения о пользователях.

models.py

class Follow(models.Model):
    user = models.OneToOneField(User,related_name="user" ,on_delete=models.CASCADE) 
    ''' to obtain user ' eeee = User.objects.first() , eeee.user'    '''          
    following = models.ManyToManyField(User,related_name='following_user',blank=True)   
    ''' to obtain followers   ' eeee.following_user.all()'   '''
    ''' to obtain following   ' eeee.user.following.all()'   '''

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

В следующем поле user.following.all () - используется для получения пользователя в поле manytomany request.user и following_user.all () используется для получения всех пользователей, которые добавили request.user в свои следующее поле.

serializers.py

class FollowerSerializer(ModelSerializer):
    user = UserSerializer(many=False)
    follower = SerializerMethodField()
    class Meta:
        model = Follow
        fields = ('user','follower')

 def get_follower(self, obj):
    context = self.context
    request = context.get("request")
    return request.user.following_user.all().values()

Здесь я сериализую всех пользователей, которые добавили request.user в свое следующее поле

views.py

class FollowerView(RetrieveAPIView):
    queryset = Follow.objects.all()
    serializer_class = FollowerSerializer
    permission_classes = [IsAuthenticated]
    lookup_field = 'id'

api

{
    "user": {
        "name": "eeee"
    },
    "is_follower": [
        {
            "id": 2,
            "user_id": 9
        },
        {
            "id": 5,
            "user_id": 16
        },
        {
            "id": 3,
            "user_id": 10
        }
    ]
}

Это api, который я получаю для всех пользователей, которые добавили request.user в свой следующий список. проблема здесь в том, что я получаю pk пользователя из ключа user_id . Но я хочу, чтобы там было имя пользователя и другая информация, такая как адрес электронной почты, полное имя пользователя, у которого есть этот первичный ключ. Итак, как я могу этого добиться?

1 Ответ

1 голос
/ 28 мая 2020

Измените метод get_follower в serializers.py следующим образом:

def get_follower(self, obj):
    context = self.context
    request = context.get("request")
    qs = request.user.following_user.all()
    data = [{'id': obj.pk, 'user_id': obj.user_id, 'name': obj.req_field} for obj in qs]
    return data
...