Django - 如何编写与此 SQL 查询等效的查询集?- 使用计数和FIRST_VALUE管理重复项



我有Model "A"即与另一个模型相关,又作为实际数据的公开面孔(模型"B"),用户可以修改a的内容,但不能修改b的内容。

对于每个B都可以有多个a,并且它们具有一对多关系。

当我显示这个模型时,只要有两个或多个A与B相关,我就会看到&;duplicate&;记录(几乎总是)相同的数据,糟糕的体验。

我想返回与B项相关的a项的查询集,当有多个时,将它们滚动到第一个输入的项。

我还想计数相关的B型产品,并返回该计数,以指示有多少副本可用。

我编写了以下类似的SQL查询,该查询计算相关项并使用first_value查找由b分区创建的第一个A

SELECT *
FROM 
(
SELECT                         
COUNT(*) OVER (PARTITION BY b_id) as count_related_items,
FIRST_VALUE(id) OVER (PARTITION BY b_id order by created_time ASC) as first_filter,                       
*
FROM A 
) AS A1 
WHERE 
A1.first_filter = A1.id;

根据要求,这里是模型的简化视图:

class CoreData(models.Model):
title = models.CharField(max_length=500)    
class UserData(models.Model):
core = models.ForeignKey("CoreData", on_delete=models.CASCADE)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
title = models.CharField(max_length=500)

当用户创建数据时,它首先检查/创建CoreData,存储像标题这样的东西,然后它创建UserData,引用CoreData。当第二个用户创建了一个数据片段,并且它引用了相同的CoreData时,就会出现"重复"。以及为什么可以卷起UserData(在SQL中)来查找计数和"first";一对多关系中的条目。

假设我的理解是正确的-

如果你从UserData模型查询,查询将看起来像这样:

考虑CoreData。Id = 18

user_data = UserData.objects.filter(core__id=18).
order_by("created_time").annotate(duplicate_count=Count('core__userData', filter(core__id=18))).first()

user_data将是创建的第一个与CoreData对象相关的对象。另外,

user_data.duplicate_count将给出与CoreData对象相关的UserData对象的计数。

关于注释的参考文档

更新:

如果你需要特定CoreData的UserData列表,你可以使用

user_data = UserData.objects.filter(core__id=18).
order_by("created_time").annotate(duplicate_count=Count('core__UserData', filter(core__id=18)))

相关内容

  • 没有找到相关文章

最新更新