python Django过滤对象,如果有对象在它们之前创建,并且具有相同的字段值,则不选择对象

lvmkulzt  于 2023-02-18  发布在  Python
关注(0)|答案(1)|浏览(145)

我尝试为ModelList视图执行get_queryset,但我只想选择前面没有其他记录具有相同event_id的那些记录。例如,我们有两个记录,第二个记录是第一个记录的子记录,因此,我不想从数据库中选择第二条记录,因为它已经在第一条记录的子字段中。子字段是在序列化程序中生成的,数据库中不存在。

数据集

[
    {
        "event_id": "63395",
        "operation_id": "25180328",
        "time_created": "2023-01-12T09:16:11.873700+01:00",
        "children": [
            {
              "event_id": "63395",
              "time_created": "2023-01-12T09:16:41.285390+01:00",
              "operation_id": "25180329",
              "children": []
            }
        ]
    },
    {
        "event_id": "63395",
        "time_created": "2023-01-12T09:16:41.285390+01:00",
        "operation_id": "25180329",
        "children": []
    }
]

查看

class ModelList(generics.ListAPIView):
    permission_classes = [permissions.IsAuthenticated]
    queryset = Model.objects.all()
    serializer_class = ModelSerializer

    def get_queryset(self):
        return Model.objects.filter(
            ~Q(
                Q(event_id=F('event_id'))
                & Q(operation_id__gt=F('operation_id'))
            )
        )
eh57zj3b

eh57zj3b1#

您可以通过使用子查询筛选出具有较高operation_id值的记录,然后使用结果查询集筛选出具有相同event_id的记录来实现这一点。

class ModelList(generics.ListAPIView):
    permission_classes = [permissions.IsAuthenticated]
    queryset = Model.objects.all()
    serializer_class = ModelSerializer

    def get_queryset(self):
        subquery = Model.objects.filter(
            event_id=OuterRef('event_id'),
            operation_id__gt=OuterRef('operation_id')
        )
        return Model.objects.annotate(
            has_higher_op=Exists(subquery)
        ).filter(
            ~Q(has_higher_op=True)
        )

相关问题