【问题标题】:function sum(boolean) does not exist函数 sum(boolean) 不存在
【发布时间】:2019-12-29 04:39:52
【问题描述】:

从 sqlite 切换到 postgres,我在 django 中遇到此错误

函数 sum(boolean) 不存在 第 1 行:..."."longitude", "pins_pin"."category_id", COALESCE(SUM("pins_...

提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。

视图集

class PinViewSet(viewsets.ModelViewSet):
    queryset = pin.objects.annotate(
        numOfUpvotes=Coalesce(Sum('upvoters__upvote'), Value(0))
    )
    permission_classes = [
        permissions.AllowAny
        # permissions.IsAuthenticated,
    ]
    serializer_class = PinSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = '__all__'

序列化器

class PinSerializer(serializers.ModelSerializer):
    username = serializers.CharField(
        source="owner.username", read_only=True)
    numOfUpvotes = serializers.IntegerField(read_only=True)
    upvoters = upVoteStorySerializer(many=True, read_only=True)
    commentstory = 
    class Meta:
        model = pin
        fields = '__all__'

class upVoteStorySerializer(DynamicFieldsMixin, serializers.ModelSerializer):
    class Meta:
        model = upVoteStory
        fields = '__all__'

型号

class pin(models.Model):
    owner = models.ForeignKey(settings.AUTH_USER_MODEL,
                              null=True, on_delete=models.CASCADE)
    title = models.CharField(max_length=50)
    description = models.TextField()
    latitude = models.CharField(max_length=50)
    longitude = models.CharField(max_length=50)
    category = models.ForeignKey(
        "categoryType", on_delete=models.CASCADE, null=True, related_name='selected_category')
    # 1 is community, 2: historical, 3: personal
    #upVotes = models.PositiveSmallIntegerField(default=0)

    def __str__(self):
        """String for representing the Model object."""
        return self.title

class upVoteStory(models.Model):
    pinId = models.ForeignKey(
        "pin", on_delete=models.CASCADE, null=True, related_name='upvoters')
    upVoter = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
    upvote = models.BooleanField(default=False)

numOfUpvotes 从 upvotestory 为每个 pin 计算 upvotes = true。将引脚添加到数据库时最初设置为 0。使用 sqlite 时,它​​可以工作,但是当我尝试迁移到 postgres 时,我会收到此错误。我尝试清除数据库和迁移并再次重做整个过程,python manage.py makemigrations 和 python manage.py migrate 但仍然会得到相同的错误

【问题讨论】:

    标签: django postgresql


    【解决方案1】:

    您可以使用Sum, Case, When 执行此操作,以计算每次upvoters__upvote 是True

    pin.objects.annotate(
        numOfUpvotes=Sum(Case(
            When(upvoters__upvote=True, then=1),
            default=Value(0),
            output_field=IntegerField()
        ))
    )
    

    【讨论】:

    • 我需要为IntegerField()导入一些东西
    • 从 django.db.models 导入 IntegerField
    • 如果新用户尝试对 pin 点赞,则不会更新
    • 注释有效吗?当您说它没有更新时,是否会将带有 upvote=True 的新条目插入到数据库中?
    • 1.是的,错误消失了。 2. 是的,我正在尝试计算每个图钉的投票数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 2015-08-05
    • 1970-01-01
    • 2019-01-02
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多