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 будет проигнорирована.

Вернуться на верх