我有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)))