DRF ModelSerializer meta extra_kwargs не работает для связанных полей
Я разрабатываю API на DRF и столкнулся с одной проблемой, которую, надеюсь, вы сможете мне помочь решить. Допустим, у меня есть следующая модель и сериализатор:
class SomeModel(models.Model):
property = models.ForeignKey(
Property,
on_delete=models.PROTECT,
)
name = models.CharField()
address = models.OneToOneField(null=True, blank=True)
...more
class SomeModelSerializer(serializer.ModelSerializer):
class Meta:
model = SomeModel
fields = "__all__""
extra_kwargs = {
"name": {"required": True},
"address": {"required": True},
"property": {"required": True},
}
Как вы видите, я пытаюсь добавить kwargs поля с помощью extra_kwargs. Проблема в том, что это не работает для связанного поля, например, для поля свойств или адреса. Я знаю, что могу просто переопределить это, определив поле вручную и передав required=True, и это работает, но это слишком долго для моего случая использования. Есть ли у вас идеи, почему так происходит? Спасибо.
Я думаю, что вам не нужно загружать объект внешнего ключа. Вам лучше добавить поля внешнего ключа, такие как property_id или address_id, вместо того, чтобы использовать эти объекты напрямую.
Так что вы можете определить это поле в классе сериализатора.
class SomeModelSerializer(serializer.ModelSerializer):
property_id = serializers.IntegerField(write_only=True, required=True)
address_id = serializers.IntegerField(write_only=True, required=True)
class Meta:
model = SomeModel
fields = "__all__"
extra_kwargs = {
"name": {"required": True},
}
Мне удалось найти ответ в документации DRF. Я не упомянул, что мои сериализаторы имеют некоторые поля, объявленные вручную, и это является причиной, согласно документации DRF:
Следует помнить, что если поле уже было явно объявлено в классе сериализатора, то опция extra_kwargs будет проигнорирована.