【问题标题】:count likes in ManyToManyField - django rest framework在 ManyToManyField 中计算喜欢 - django rest 框架
【发布时间】:2020-12-14 14:07:56
【问题描述】:

在models.py中:

class Post(models.Model):
    body = models.TextField(max_length=10000)
    date = models.DateTimeField(auto_now_add=True, blank=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    liked_by = models.ManyToManyField(User, blank=True, related_name='liked_by')

    class Meta:
        ordering = ['-date']

在 serializers.py 中:

class PostSerializer(serializers.ModelSerializer):
    user = UserSerializers()
    class Meta:
        model = Post
        fields = ('body','date','user')

如何计算单个帖子的点赞数?并显示哪些用户喜欢该帖子。

【问题讨论】:

  • 如果您正在使用 django 构建一个 rest 应用程序,请尽量避免使用 m2m 关系,因为 DRF 并不真正支持它(它引入了很多嵌套对象)
  • @SLDem 先生,我应该使用什么来代替多对多关系?我是 drf 的新手????
  • 尝试创建一个单独的关系表,其中每个关系成员有 2 个外键,并从中提取数据

标签: python django django-rest-framework


【解决方案1】:
class PostSerializer(serializers.ModelSerializer):
    user = UserSerializers()
    total_likes = serilaizers.SerializerMethodField()
    liked_by = UserSerializers(many=True)
    class Meta:
        model = Post
        fields = ('body','date','user', 'total_likes', 'liked_by')

    def get_total_likes(self, instance):
      return instance.liked_by.count()
    

【讨论】:

  • 我在尝试导入 UserSerializer from users.serializers import UserSerializer 时遇到错误 ImportError: cannot import name 'UserSerializer',但它仍然显示错误。我的用户模型在另一个APP中。
  • 使用 appName.serializers 导入 UserSerializer
  • users 是我的应用名称
【解决方案2】:
  1. 您需要更改类 Post manyToMany 关系添加“通过 =”。

    liked_by = models.ManyToManyField(User, through='liked_users', blank=True, related_name='liked_by')

  2. 手动创建 LikedUsers 模型:

类 LikedUsers(models.Model): like_count = models.IntegerField(default=0) post = models.ForeignKey(Post, related_name='likedusers', on_delete=models.CASCADE) user = models.ForeignKey(User, related_name='likedusers', on_delete=models.CASCADE)

  1. 获得喜欢的访问权限(post.likedusers[0].liked_count, ... 下一个用户)

【讨论】:

    【解决方案3】:

    您可以使用 SerializerMethodField 获取帖子的总点赞数。

    from rest_framework.fields import SerializerMethodField
    
    class PostSerializer(serializers.ModelSerializer):
        user = UserSerializers()
        total_likes = SerializerMethodField()
    
        class Meta:
            model = Post
            fields = ('body','date','user')
    
        def get_total_likes(self, instance):
            return instance.liked_by.all().count()
    

    【讨论】:

      【解决方案4】:

      您的 Liked_by 字段仅引用 User 模型,而不是 User 模型,并且您只有喜欢您的帖子但喜欢数量的人。所以你可以查询某些帖子并统计用户数量,但我建议有单独的喜欢计数字段

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-19
        • 2021-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-17
        • 1970-01-01
        相关资源
        最近更新 更多