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