计算来自另一个模型Django的点赞次数 [英] count the number of likes from another model 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 aForeignKey
field, since Django will automatically add a "twin" field with an_id
suffix. Therefore it should bepet
, instead of.petId
这篇关于计算来自另一个模型Django的点赞次数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!