如何在 Django ORM 中不计算同一用户在一天内创建的对象?
How not to count the objects created within a day by the same user in Django ORM?
我有一个 Product
和 User
模型,我想生成产品视图的统计信息(想法是实现视图计数)。我创建了一个名为 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()
我有一个 Product
和 User
模型,我想生成产品视图的统计信息(想法是实现视图计数)。我创建了一个名为 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()