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