Все поля в ModelSerializer django rest framework

models.py:

class Car():
    producer = models.ForeignKey(Producer, blank=True, null=True,)
    color = models.CharField()
    car_model = models.CharField()
    doors = models.CharField()

serializers.py:

class CarSerializer(ModelSerializer):

    class Meta:
        model = Car
        fields = Car._meta.get_all_field_names()

Итак, здесь я хочу использовать все поля. Но у меня есть ошибка:

Имя поля producer_id недействительно для модели Car.

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

Благодарю!

Ответ 1

В соответствии с Django REST Framework Документация по ModelSerializer:

По умолчанию все поля модели в классе будут сопоставлены с соответствующими полями сериализатора.

Это отличается от Django ModelForms, которая требует, чтобы вы указали специальный атрибут '__all__' чтобы использовать все поля модели. Поэтому все, что необходимо, это объявить модель.

class CarSerializer(ModelSerializer):
    class Meta:
        model = Car

Обновление (для версий> = 3.5)

Поведение, описанное выше, устарело в версии 3.3 и запрещено начиная с версии 3.5.

Теперь обязательно использовать специальный атрибут '__all__' чтобы использовать все поля в Django REST Framework, так же как и в Django Forms:

Если не задать ни поля, ни исключить, появилось ожидающее предупреждение об устаревании в версии 3.3 и появилось предупреждение об устаревании в 3.4. Его использование теперь обязательно.

Так что теперь это должно быть:

class CarSerializer(ModelSerializer):
    class Meta:
        model = Car
        fields = '__all__'

Ответ 2

Вы можете использовать fields = '__all__' чтобы получить все свои поля, или вы можете указать, хотите ли вы вернуть ограниченное число полей. См. Документацию.

Но это возвращает значение id для поля внешнего ключа, то есть producer в вашем случае. Чтобы получить все поля для producer, вам также нужно создать для него класс serializer. См. Здесь.

Поэтому ваш обновленный serializers.py должен быть:

class ProducerSerializer(ModelSerializer):
    class Meta:
        model = Producer

class CarSerializer(ModelSerializer):
    producer= ProducerSerializer(read_only=True)

    class Meta:
        model = Car
        fields = ('producer', 'color', 'car_model', 'doors', )