Django эквивалент ASP.NET Parameter Binding или Ruby on Rails Action Controller Parameters

Мне интересно, о чем говорится в заголовке. Вот ссылки на упомянутые примеры, касающиеся других техник:

В настоящее время я создаю API, используя DRF и использую пользовательский код в представлениях или методах валидации сериализаторов для проверки параметров, например, так:

class AnimalWriteSerializer(serializers.ModelSerializer):
    class Meta:
        model = Animal
        fields = '__all__'

    def validate_dicose_category(self, value):
        raise serializers.ValidationError('Dicose Category cannot be set manually.')

Есть ли лучший способ?

Поскольку в вашем примере вы говорите сериализатору поддерживать __all__ поля, то вам нужно отключить обновление этого поля вручную.

Вероятно, вы хотите использовать exclude, как в примере ниже, который просто удалит поле из "all". Основное различие между exclude и использованием read_only заключается в том, что вывод будет включать dicose_category.


Используйте exclude= для исключения этого поля. Это противоположность fields=, и вы можете использовать только одну за один раз.

class AnimalWriteSerializer(serializers.ModelSerializer):
    dicose_category = serializers.CharField(read_only=True)
    class Meta:
        model = Animal
        exclude = ["dicose_category"]

Вы можете объявить поле только для чтения (напрямую или с помощью extra kwarg). Вы не сможете записать его, но оно будет включено в вывод. Я не уверен, зачем вам это нужно, но это может быть полезно, если вы используете возвращаемые данные для чего-то и они вам нужны.

class AnimalWriteSerializer(serializers.ModelSerializer):
    dicose_category = serializers.CharField(read_only=True)
    class Meta:
        model = Animal
        fields = "__all__"

# or declare an extra_kwarg which does the same thing:
class AnimalWriteSerializer(serializers.ModelSerializer):
    class Meta:
        model = Animal
        fields = "__all__"
        extra_kwargs = {
            "dicose_category": { "read_only": True }
        }

И, наконец, я настоятельно рекомендую перечислить все поля, которые вы хотите обновить, напрямую, а не использовать __all__ или exclude=.

  1. Новые поля, добавленные в модель, не подлежат автоматическому обновлению
  2. Все обновляемые поля явно и четко перечислены
  3. Юнит-тесты теперь могут быть явными, а формат вывода согласован
class AnimalWriteSerializer(serializers.ModelSerializer):
    class Meta:
        model = Animal
        fields = [
            "name",
            "mission",
            "favorite_color",
        ]
Вернуться на верх