Все поля в 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', )