Понимание требования к связанному полю для обеспечения набора запросов

Подумайте:

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, заключается в том, что такое поле по умолчанию доступно только для чтения.

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