python - 如何在 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。
任何人都可以知道这件事吗?
解决方案
您可以在 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"
},
推荐阅读
- ansible - 在ansible中使用with_sequence在with_subelement上循环
- selenium - Selenium Webdrive 所需的自动化建议
- python - Python Pandas new dataframe column with group by and condition
- flutter - Flutter TextField - how to shrink the font if the text entered overflows
- css - Changing the Visual Composer CSS path to prevent https errors
- jquery - JQuery JSON 键集自动完成
- r - 我怎样才能最干净地使用 Roxygen2 来记录 R 中的向量
- html - How to support HTML dom elements with RTL / LTR languages?
- php - "SQLSTATE[HY000]: General error: 1364 Field 'user_id' doesn't have a default value (SQL: insert into
- dpdk - dpdk vmxnet3 clear stats missing (?) implementation