首页 > 解决方案 > 如何不计算 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

问题:如何删除同一用户一天内查看的产品?

标签: djangodjango-orm

解决方案


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

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

推荐阅读