Получить счет как отдельный атрибут результата Django - PullRequest
0 голосов
/ 12 февраля 2020

Мне нужен мой код для возврата счетчика для определенного идентификатора камеры c, который активен, и я хочу, чтобы он возвращался только один раз и отдельно. Но это происходит с каждой записью. Мой код, как показано ниже для класса модели:

def activeness(self):
        result = MinuteRecords.objects.filter(
            cam_id=self.cam_id,
            face_status='Active',
        ).count()
        return result

Для моего сериализатора:

class MinuteRecordsSerializer(serializers.ModelSerializer):
    timeago = serializers.DateTimeField(read_only=True)
    activeness = serializers.IntegerField(read_only=True)

    class Meta:
        model = MinuteRecords
        fields = '__all__'
        read_only_fields = ('timeago',)

Результат, который я получаю,

[
    {
        "id": 1,
        "timeago": "5 days, 21 hours",
        "activeness": 2,
        "cam_id": 1,
        "timestamp": "2020-02-06T14:55:26.852392Z",
        "face_status": "Active"
    },
    {
        "id": 6,
        "timeago": "1 week",
        "activeness": 2,
        "cam_id": 1,
        "timestamp": "2020-02-04T15:17:34.590323Z",
        "face_status": "Active"
    }
]

Результат, который я ожидайте:

[
    {
        "id": 1,
        "timeago": "5 days, 21 hours",
        "cam_id": 1,
        "timestamp": "2020-02-06T14:55:26.852392Z",
        "face_status": "Active"
    },
    {
        "id": 6,
        "timeago": "1 week",
        "cam_id": 1,
        "timestamp": "2020-02-04T15:17:34.590323Z",
        "face_status": "Active"
    },
        "activeness": 2,
]

Суть в том, что я хочу вернуть общее количество записей после моего запроса в виде отдельной записи, а не добавляться к каждому результату.

1 Ответ

0 голосов
/ 12 февраля 2020

Вы можете добиться этого, переопределив finalize_response метод вашего ViewSet.

def finalize_response(self, request, response, *args, **kwargs):

     response_received = super().finalize_response(request, response, *args, **kwargs)
     if len(response_received.data) > 0:
        activeness = response_received.data[0].pop('activeness', None)
        for minute_data in response_received.data:
            minute_data.pop('activeness', None)

     response_received.data.append({'activeness': activeness} 


     return response_received

Что вы делаете здесь, так это то, что вы настраиваете ответ в соответствии со своими требованиями после извлечения записей из БД.

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

...