Django Rest Framework Упорядочение полей ManyToMany - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть следующие модели:

class BusStop(m.Model):
    street_name = m.CharField(max_length=255)

    class Meta:
        ordering = ['street_name']
    ...

class Carrier(m.Model):
    name = m.CharField(max_length=255)
    ...

class CarrierStop(m.Model):
    bus_stop = m.ManyToManyField(BusStop, related_name='carrier_stop_fk')
    carrier = m.ForeignKey(Carrier, on_delete=m.CASCADE, related_name='test_carrier_fk')

Я сделал сериализатор:

    class CarrierStopSerializer(serializers.ModelSerializer):
        carrier = serializers.StringRelatedField()
        bus_stop = serializers.StringRelatedField(many=True)

             class Meta:
                    model = CarrierStop
                    fields = ['id', 'carrier', 'bus_stop']

У меня есть несколько объектов моделей BusStop, и сериализатор дает представление, подобное этому:

    [
        {
            "id": 1,
            "carrier": "Fremiks",
            "bus_stop": [
                    "Armii Krajowej",
                    "Kino Lot 01",
                    "Kosynierów I 02"
            ]
        }
    ]

Поле bus_stop от CarrierStopSerializer возвращает автобусные остановки, упорядоченные по имени.Я хочу заказать его по идентификатору в промежуточной таблице carriertop_bus_stop, созданном полем Django ManyToMany.Я знаю, что я должен использовать поле SerializerMethod вместо StringRelatedField (или PrimaryKeyRelatedField, не имеет значения), но я не уверен, как именно это сделать.

1 Ответ

0 голосов
/ 26 сентября 2018

Использовать SerializerMethodField как

class CarrierStopSerializer(serializers.ModelSerializer):
    carrier = serializers.StringRelatedField()
    <b>bus_stop = serializers.SerializerMethodField(read_only=True)

    def get_bus_stop(self, model):
        return [bus_stop.__str__() for bus_stop in model.bus_stop.all().order_by('id')]</b>

    class Meta:
        model = CarrierStop
        fields = ['id', 'carrier', 'bus_stop']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...