首页 > 解决方案 > 如何在 Django REST 框架中的关注者和关注系统中获取用户的 id 名称?

问题描述

我想创建一个关注者和关注系统,我创建了但我想添加用户名以及他们的 following_user_id 或 user_id。我怎样才能做到这一点?

模型.py

from django.db import models
from django.contrib.auth.models import User
from django.http import JsonResponse

## Create your models here.


class UserFollowing(models.Model):
    user_id = models.ForeignKey(User, related_name="following", on_delete=models.CASCADE)
    following_user_id = models.ForeignKey(User, related_name="followers", on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True, db_index=True)

    class Meta:
        unique_together = (('user_id', 'following_user_id'),)
        index_together = (('user_id', 'following_user_id'),)
        ordering = ["-created"]

    def __str__(self):
        f"{self.user_id} follows {self.following_user_id}"

serializers.py/UserSerializers


class UserSerializer(serializers.ModelSerializer):

    following = serializers.SerializerMethodField()
    followers = serializers.SerializerMethodField()

    # for validate user email
    def validate_email(self, value):
        lower_email = value.lower()
        if User.objects.filter(email=lower_email).exists():
            raise serializers.ValidationError("Email already exists")
        return lower_email

    class Meta:
        model = User
        fields = ['id', 'first_name', 'username', 'last_name', 'email', 'password', 'date_joined','following','followers']
        # extra_kwargs for validation on some fields.
        extra_kwargs = {'password': {'write_only': True, 'required': True},
                        'first_name': {'required': True}, 'last_name': {'required': True},
                        'email': {'required': True}
                        }

    def get_following(self, obj):
        return FollowingSerializer(obj.following.all(), many=True).data

    def get_followers(self, obj):
        return FollowersSerializer(obj.followers.all(), many=True).data


    def create(self, validated_data):
        user = User.objects.create_user(**validated_data)  # create user
        Token.objects.create(user=user)  # create token for particular user
        return user

FollowerSerializer 和 FollowerSerializes

class FollowingSerializer(serializers.ModelSerializer):

    class Meta:
        model = UserFollowing
        fields = ("id", "following_user_id", "created")


class FollowersSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserFollowing
        fields = ("id", "user_id", "created")

视图集

class UserFollowingViewSet(viewsets.ModelViewSet):

    serializer_class = FollowingSerializer
    queryset = UserFollowing.objects.all()

class UserFollowerViewSet(viewsets.ModelViewSet):

    serializer_class = FollowersSerializer
    queryset = UserFollowing.objects.all()

输出

    {
        "id": 11,
        "first_name": "",
        "username": "John",
        "last_name": "",
        "email": "",
        "date_joined": "2021-04-30T08:43:48.577328Z",
        "following": [
            {
                "id": 19,
                "following_user_id": 14,
                "created": "2021-04-30T17:42:31.491779Z"
            }
        ],
        "followers": [
            {
                "id": 24,
                "user_id": 13,
                "created": "2021-04-30T17:48:56.153387Z"
            },
            {
                "id": 20,
                "user_id": 14,
                "created": "2021-04-30T17:46:38.001047Z"
            }
        ]
    },

我在输出中得到了以下和关注者列表,但在这个列表中,我还想添加一个用户名和他们的 following_user_id 或 user_id。

任何人都可以知道这件事吗?

标签: pythondjangodjango-rest-framework

解决方案


您可以在 userfollowing 模型中创建一个用户名字段,如下所示


class UserFollowing(models.Model):
    user_id = models.ForeignKey(User, related_name="following", on_delete=models.CASCADE)
    following_user_id = models.ForeignKey(User, related_name="followers",on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True, db_index=True)
    username = models.Charfield(max_length=200, null=True)

并使用信号将用户名存储在用户名字段中,因此您将在序列化后得到用户名列

"following": [
            {
                "id": 19,
                "following_user_id": 14,
                "created": "2021-04-30T17:42:31.491779Z",
                "username":"maria"
            }
        ],
        "followers": [
            {
                "id": 24,
                "user_id": 13,
                "created": "2021-04-30T17:48:56.153387Z",
                "username":"angel"
            },


推荐阅读