Понимание требования к связанному полю для обеспечения набора запросов
Подумайте:
class CouponSerializer(serializers.ModelSerializer):
courses = serializers.PrimaryKeyRelatedField(
many=True, read_only=True)
class Meta:
model = Coupon
exclude = ['users']
Если я удалю read_only=True
, я получу ошибку:
AssertionError: Relational field must provide a `queryset` argument, override `get_queryset`, or set read_only=`True`.
В документации говорится:
Набор запросов, используемый для поиска экземпляра модели при проверке ввода поля. Отношения должны либо явно задать queryset, либо установить read_only=True
.
Какая логика лежит в основе этого требования? Почему нет такого требования для StringRelatedField
?
вам нужно добавить ready_only, если вы будете использовать этот сериализатор только для просмотра данных, или использовать аргумент queryset, если вы хотите сохранить данные, это позволит сериализатору проверить данные перед сохранением их в базу данных
example
class CouponSerializer(serializers.ModelSerializer):
courses = serializers.PrimaryKeyRelatedField(
many=True, queryset = Course.objects.all() )
class Meta:
model = Coupon
exclude = ['users']
это при проверке данных, если в списке курсов нет курсов, возникнет ошибка
Django Rest Framework должен знать, в каком наборе запросов искать, действителен ли номер, который пользователь отправил в запросе.
Допустим, пользователь отправляет POST-запрос вашему представлению, которое использует этот сериализатор. С полезной нагрузкой, подобной этой:
{
"courses": [1, 2, 3]
}
Итак, мы хотим создать экземпляр Coupon
с полем courses
, которое будет заполнено экземплярами Course
с id 1, 2 и 3.
DRF проверит этот запрос, чтобы убедиться, что первичные ключи 1, 2 и 3 существуют в модели Course
. Если мы не добавим queryset = Course.objects.all()
, то DRF не будет знать, в какой модели искать.
Причина, по которой вам не нужно добавлять в StringRelatedField
, заключается в том, что такое поле по умолчанию доступно только для чтения.