如何在 Django ORM 中不计算同一用户在一天内创建的对象?

How not to count the objects created within a day by the same user in Django ORM?

我有一个 ProductUser 模型,我想生成产品视图的统计信息(想法是实现视图计数)。我创建了一个名为 ProductViewed 的新模型,并在我发出 get 请求以检索单个 Product 时触发该信号。我知道如何获取每个 Product 的观看次数。但是我想让统计数据公平,我想删除一天内由同一用户或 IP 地址生成的所有视图。

产品查看型号

class ProductViewed(models.Model):
    user = models.ForeignKey(
        get_user_model(), on_delete=models.CASCADE, blank=True, null=True, related_name="viewed")
    ip_address = models.CharField(max_length=255, blank=True, null=True)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f'{str(self.product)} viewed on {self.created_at}'

    class Meta:
        ordering = ('-created_at', )
        verbose_name_plural = "ProductViewed"

我正在使用的查询如下:

ProductViewed.objects.filter(product_id=<someid>).count()

我想实现这个

# before filtering
Pr1 viewed on 08.07.2020 by user1, Pr1 viewed on 08.07.2020 by user1, Pr1 viewed on  08.07.2020 by user2
# after filtering
Pr1 viewed on 08.07.2020 by user1, Pr1 viewed on 08.07.2020 by user2

问题:如何去除同一用户一天内浏览过的商品?

您可以使用 distinct()。您可以将现有字段添加到值中。

ProductViewed.objects.filter(product_id=<someid>).values("user", "ip_address", "created_at__date").distinct().count()

试试这个

ProductViewed.objects.filter(product_id=<someid>).values("user", "created_at__date").distinct().count()