Django rest framework: имя 'Serializer' не определено - PullRequest
0 голосов
/ 04 августа 2020

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

Модели:

class Mechanic(models.Model):
    name = models.CharField('Name', max_length=256)
    status = models.CharField('Status', choices=constants.MECHANIC_STATUS, default=constants.MECHANIC_STATUS[0][0],
                              max_length=64)
    current_lat = models.CharField('Current Latitude', max_length=64)
    current_lng = models.CharField('Current Longitude', max_length=64)

    def __str__(self):
        return self.name


class Service(models.Model):
    type = models.CharField('Service Type', choices=constants.SERVICE_TYPES,
                            default=constants.SERVICE_TYPES[0][0], max_length=64)
    mechanic = models.ForeignKey(Mechanic, on_delete=models.CASCADE, related_name='services')
    vehicle_type = models.CharField('Vehicle Type', choices=constants.VEHICLE_TYPES,
                                    default=constants.VEHICLE_TYPES[0][0], max_length=64)
    charges = models.IntegerField('Charges')

    def __str__(self):
        return "{}, {}".format(self.mechanic, self.type)

Сериализаторы:

class ServiceSerializer(serializers.ModelSerializer):
    mechanic = MechanicSerializer(read_only=True) # Throws an error

    class Meta:
        model = Service
        fields = ('id', 'type', 'mechanic', 'vehicle_type', 'charges')


class MechanicSerializer(serializers.ModelSerializer):
    services = ServiceSerializer(many=True, read_only=True)

    class Meta:
        model = Mechanic
        fields = ('id', 'name', 'status', 'services', 'current_lat', 'current_lng')
        read_only_fields = ('id',)

Как подойти к этой проблеме? Я понимаю, что создал зависимость cycli c, потому что оба сериализатора зависят друг от друга.

Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 04 августа 2020

в качестве расширения к моему комментарию в OP, создайте новый класс сериализатора модели Mechanic перед ServiceSerializer class

<b>class MechanicShortSerializer(serializers.ModelSerializer):
    class Meta:
        model = Mechanic
        fields = '__all__'</b>


class ServiceSerializer(serializers.ModelSerializer):
    <b>mechanic = MechanicShortSerializer(read_only=True) # replace with new serializer</b>

    class Meta:
        model = Service
        fields = ('id', 'type', 'mechanic', 'vehicle_type', 'charges')


class MechanicSerializer(serializers.ModelSerializer):
    services = ServiceSerializer(many=True, read_only=True)

    class Meta:
        model = Mechanic
        fields = ('id', 'name', 'status', 'services', 'current_lat', 'current_lng')
        read_only_fields = ('id',)
...