计算来自另一个模型Django的点赞次数 [英] count the number of likes from another model Django

查看:42
本文介绍了计算来自另一个模型Django的点赞次数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

实现用户喜欢宠物的相似模型.如果用户按下,isLike将为true,而isLike为false型号

implementing a like model where user could like a pet. If user presses like, isLike would be true while unlike would be isLike is false Model

class pet(models.Model):
    name = models.CharField(max_length=50)

class likes(models.Model):
    petId = models.ForeignKey(
        "pet", on_delete=models.CASCADE, null=True)
    liker = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
    isLike = models.BooleanField(default=False)

class countlikes(models.Model):
    petId = models.ForeignKey(
        "pet", on_delete=models.CASCADE, null=True)
    numOfLikes = models.PositiveSmallIntegerField(default=0)


序列化器

class PetSerializer( serializers.ModelSerializer):
    class Meta:
        model = pet
        fields = '__all__'


class LikesSerializer( serializers.ModelSerializer):
    class Meta:
        model = likes
        fields = '__all__'


class CountlikesSerializer(DynamicFieldsMixin, serializers.ModelSerializer):

    class Meta:
        model = countlikes
        fields = '__all__'

视图集

class PetViewSet(viewsets.ModelViewSet):
    queryset = pet.objects.all()
    permission_classes = [
        permissions.AllowAny
        # permissions.IsAuthenticated,
    ]
    serializer_class = PetSerializer

class LikesViewSet(viewsets.ModelViewSet):
    queryset = likes.objects.all()
    permission_classes = [
        permissions.AllowAny
        # permissions.IsAuthenticated,
    ]
    serializer_class = LikesSerializer

class CountlikesViewSet(viewsets.ModelViewSet):
    queryset = countlikes.objects.all()
    permission_classes = [
        permissions.AllowAny
        # permissions.IsAuthenticated,
    ]
    serializer_class = countlikesSerializer

我尝试了什么:两个获取请求以获取喜欢"数,以及isLike是true还是false.如果用户喜欢,我会增加numOfLikes,如果用户不喜欢,我会递减,然后发出放置请求.

what I tried: two get requests to get the Number of likes and if isLike is true or false. If user likes, i would increment the numOfLikes and decrement if user unlikes and then do a put request.

推荐答案

countlikes 将在您的建模中引入数据重复,事实证明,保持数据同步比看起来困难..因此,我建议删除 countlikes 模型.尤其是因为它不是一个真实的实体:它是"纯伪造".

The countlikes will introduce data duplication in your modeling, and it turns out that keeping data in sync, is harder than it might look. Therefore I advice to remove the countlikes model. Especially since it is not a real entity: it is "pure fabrication".

您可以在 PetSerializer 中添加两个额外的字段:

You can add two extra fields in your PetSerializer:

class PetSerializer(serializers.ModelSerializer):
    likes = serializers.IntegerField()
    dislikes = serializers.IntegerField()

    class Meta:
        model = pet
        fields = ('id', 'name', 'likes', 'dislikes')

然后在您的 ModelViewSet 中,传递一个带有注释的查询集:

In your ModelViewSet, you then should pass a queryset that is annotated:

from django.db.models import Count, Sum, Value
from django.db.models.functions import Coalesce

class PetViewSet(viewsets.ModelViewSet):
    queryset = pet.objects.annotate(
        likes=Coalesce(Sum('likes__isLike'), Value(0)),
        dislikes=Coalesce(Count('likes')-Sum('likes__isLike'), Value(0))
    )
    serializer_class = PetSerializer

注意:通常是Django模型,就像Python中的所有类在 PerlCase 中都有一个名称,而不是 snake_case 一样,因此它应该是:宠物而不是 pet .

Note: normally a Django models, just like all classes in Python are given a name in PerlCase, not snake_case, so it should be: Pet instead of pet.

 

注意:通常,Django模型的名称为单数,因此 Like 而不是 likes .

Note: normally a Django model is given a singular name, so Like instead of likes.

 

注意:由于Django,通常不会在 ForeignKey 字段中添加后缀 _id 会自动添加带 _id 后缀的双胞胎"字段.因此它应该是 pet ,而不是 petId .

Note: Normally one does not add a suffix _id to a ForeignKey field, since Django will automatically add a "twin" field with an _id suffix. Therefore it should be pet, instead of petId.

这篇关于计算来自另一个模型Django的点赞次数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆