python - 实施追随者和追随者无法正常工作
问题描述
我有一个用户模型,它有一个用于查找的 slug 字段。我正在尝试在我的 rest API 中将用户关注和关注者作为自己的模型来实现,因此我可以保存有关关注者和关注者的更多信息,并且由于我正在尝试构建一个大项目,因此我认为这是一个更好的做法。
问题是代码不起作用,并且用户在尝试关注时没有关注用户。
如果用户,我希望能够关注用户,而用户无法关注自己并关注一次
模型.py
class UserFollowing(models.Model):
following = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="follows", null=False, blank=False, on_delete=models.DO_NOTHING)
followers = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="followed_by", null=False, blank=False, on_delete=models.DO_NOTHING)
followed_on = models.DateTimeField(auto_now_add=True)
序列化程序.py
class UserFollowingSerializer(serializers.ModelSerializer):
following_count = serializers.SerializerMethodField(read_only=True)
followers_count = serializers.SerializerMethodField(read_only=True)
user_is_following = serializers.SerializerMethodField(read_only=True)
followed_on = serializers.SerializerMethodField(read_only=True)
class Meta:
model = UserFollowing
fields = "__all__"
def get_followed_on(self, instance):
return instance.followed_on.strftime("%d %B, %Y")
def get_following_count(self, instance):
return instance.following.count()
def get_followers_count(self, instance):
return instance.followers.count()
def get_user_is_following(self, instance):
request = self.context.get("request")
return instance.following.filter(slug=request.user.slug).exists()
视图.py
class UserFollowAPIView(APIView):
serializer_class = UserFollowingSerializer
permission_classes = [IsAuthenticated]
def delete(self, request, pk):
user = get_user_model().objects.get("slug")
UserFollowing.objects.delete(user_id=user, following_user_id=user)
def post(self, request, pk):
user = get_user_model().objects.get("slug")
UserFollowing.objects.create(user_id=user, following_user_id=user)
网址.py
path("<slug:slug>/follow/", UserFollowAPIView.as_view(), name="users-follow"),
非常感谢
解决方案
模型.py
class UserFollowing(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL)
following = models.ManyToMany(settings.AUTH_USER_MODEL, related_name="follows",null=False, blank=False, on_delete=models.DO_NOTHING)
followers = models.ManyToMany(settings.AUTH_USER_MODEL, related_name="followed_by",null=False, blank=False, on_delete=models.DO_NOTHING)
followed_on = models.DateTimeField(auto_now_add=True)
序列化程序.py
class UserFollowingSerializer(serializers.ModelSerializer):
following_count = serializers.SerializerMethodField(read_only=True)
followers_count = serializers.SerializerMethodField(read_only=True)
user_is_following = serializers.SerializerMethodField(read_only=True)
followed_on = serializers.SerializerMethodField(read_only=True)
class Meta:
model = UserFollowing
fields = "__all__"
def get_followed_on(self, instance):
return instance.followed_on.strftime("%d %B, %Y")
def get_following_count(self, instance):
return instance.following.count()
def get_followers_count(self, instance):
return instance.followers.count()
def get_user_is_following(self, instance):
request = self.context.get("request")
return instance.following.filter(slug=request.user.slug).exists()
视图.py
class UserFollowAPIView(APIView):
serializer_class = UserFollowingSerializer
permission_classes = [IsAuthenticated]
def delete(self, request, pk):
user = get_user_model().objects.get("slug")
user.objects.delete(user_id=user, following_user_id=user)
def post(self, request, pk):
user = UserFollowing.objects.get(user=request.user) #this is the user that wants to follow someone
who_to_follow = UserFollowing.objects.get('slug') #i hope the slug is the user to be followed thoo ..user being followed
user.followers.add(who_to_follow)
网址.py
path("<slug:slug>/follow/", UserFollowAPIView.as_view(), name="users-follow"),
我还没有测试过这段代码.....所以它只是直觉......但它应该可以工作
推荐阅读
- html - Laravel 如何更改“这些凭据与我们的记录不匹配”
- python - Appending sections of a file into duplicates of a previously written file
- postgresql - Aqueduct failed to execute db migration file
- python - KivyMD 如何使用 on_focus 事件获取焦点文本字段的 id
- ruby-on-rails - Solidus: [Spree WARNING] Missing migrations
- python - Django单元测试“匹配查询不存在”
- python - 为什么我的 for 循环返回字符而不是字符串
- python - 打印内有多个空格
- vue.js - 图像源未随着对象 URL 的更改而更新 - vue.js
- flutter - 颤振“showDialog”与“循环进度指示器”不弹出