Nano Hash - криптовалюты, майнинг, программирование

Структура отдыха Django: имя «Сериализатор» не определено

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

Модели:

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',)

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

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


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

Ответы:


1

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

class MechanicShortSerializer(serializers.ModelSerializer):
    class Meta:
        model = Mechanic
        fields = '__all__'


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

    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',)
04.08.2020
  • Спасибо... В конце концов я сделал то же самое 04.08.2020
  • Рекурсия будет бесконечной, и поэтому у вас нет других вариантов. 04.08.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..