Как сериализовать настроенный результат запроса? - PullRequest
0 голосов
/ 06 октября 2018

В сериализаторе моделей django типичный сценарий использования подобен приведенному нижекоторый ссылается на SalseMan.Я хочу спросить, сколько заказов получает каждый продавец.

SQL будет выглядеть как

SELECT ID, NAME, COUNT(ORDER.ID) FROM SALSE_MAN, ORDER WHERE ORDER.UID = SALSE_MAN.ID GROUP BY SALSE_MAN.ID

Как сериализовать этот запрос?

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

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

Не знаю, какие именно у вас модели, но в коде это может выглядеть так:

class SalesManSerializer(serializers.ModelSerializer):
    total_orders = serializers.IntegerField()

    class Meta:
        module = models.SalesMan
        fields = ('id', 'name', 'total_orders')

Сериализаторыответственность только за сериализацию.Они не создают наборы запросов для нас.Тем не менее, вы должны аннотировать запрос установить самостоятельноВ представлении или там, где набор запросов будет инициализирован и передан в сериализатор, вы можете использовать аннотация для аннотирования объекта с количеством заказов.

Например:

class SalesManViewSet(viewsets.ModelViewSet):
    serializer_class = SalesManSerializer

    def get_queryset(self):
        return SalesMan.objects.annotate(
            total_trucks = Count('orders'),
        )
0 голосов
/ 06 октября 2018

Вы можете добавить его, используя поле метода

class SalesManSerializer(serializers.ModelSerializer):
    count = serializers.SerializerMethodField()

    class Meta:
        model = models.SalesMan 
        fields = ('id', 'name', 'count')

    def get_count(self, instance):
        return Order.objects.count()
...