DRF Как отобразить только непустое значение сериализуемого вложенного объекта

Я создал сериализацию, вложенную следующим образом

[
{
    "id": 1,
    "name": "Auto",
    "iconname": "taxi_alert_outlined",
    "budgetamount": "0.00",
    "iconcolor": "4294951175",
    "dailyexpense_category": []
},
{
    "id": 2,
    "name": "Foods:Breakfast",
    "iconname": "emoji_food_beverage",
    "budgetamount": "0.00",
    "iconcolor": "4294951175",
    "dailyexpense_category": [
        {
            "id": 24574,
            "payee_item_desc": "เซเว่น",
            "amount": "-100.00",
            "remarks": "เฟิส",
            "tran_date": "2022-04-01T00:00:00Z",
            "isnotclear": false,
            "category": 2
        }
    ]
}

]

Ожидаемый результат после фильтра только непустого значения

[
{
    "id": 2,
    "name": "Foods:Breakfast",
    "iconname": "emoji_food_beverage",
    "budgetamount": "0.00",
    "iconcolor": "4294951175",
    "dailyexpense_category": [
        {
            "id": 24574,
            "payee_item_desc": "เซเว่น",
            "amount": "-100.00",
            "remarks": "เฟิส",
            "tran_date": "2022-04-01T00:00:00Z",
            "isnotclear": false,
            "category": 2
        }
    ]
}

]

Я пытался создать пользовательское поле, такое как вложенный объект sum или вложенный объект count. но я хочу что-то более простое для фильтрации только не пустых объектов.

Думаю, вам нужно добавить фильтр, подобный следующему.

queryset = Category.objects.prefetch_related(
    Prefetch('dailyexpense_category', 
    queryset=DailyExpense.objects.filter(tran_date__range=[fromDate, toDate]).order_by('tran_date'), to_attr='filtered_dailyexpense_category')
).annotate(num_daily=Count('dailyexpense_category')).filter(num_daily__gt=0)

Надеюсь, это может помочь.

Слушайте мой код, как предложил Mr.Metalgear

class CategoryWithDailyExpenseViewSet(viewsets.ModelViewSet):
    def get_queryset(self):
        fromDate = parse_datetime(self.request.query_params.get(
            'fromDate') + ' ' + '00:00:00').strftime('%Y-%m-%d %H:%M:%S')
        toDate = parse_datetime(self.request.query_params.get(
            'toDate') + ' ' + '00:00:00').strftime('%Y-%m-%d %H:%M:%S')
        queryset = Category.objects.prefetch_related(
            Prefetch('dailyexpense_category', queryset=DailyExpense.objects.filter(
                tran_date__range=[fromDate, toDate]).order_by('tran_date'), to_attr='filtered_dailyexpense_category')
        ).annotate(num_daily=Count('dailyexpense_category')).filter(num_daily__gt=0)
        return queryset
Вернуться на верх