Considerar:
class CouponSerializer(serializers.ModelSerializer): courses = serializers.PrimaryKeyRelatedField( many=True, read_only=True) class Meta: model = Coupon exclude = ['users'] Si read_only=True , obtengo el error:
AssertionError: Relational field must provide a `queryset` argument, override `get_queryset`, or set read_only=`True`.La documentación dice:
El conjunto de consultas utilizado para las búsquedas de instancias de modelo al validar la entrada de campo. Las relaciones deben establecer un conjunto de consultas explícitamente o establecer read_only=True
¿Cuál es la lógica que subyace a este requisito? ¿Por qué no existe tal requisito para StringRelatedField ?
necesita agregar ready_only si solo usará este serializador para ver datos o usará el argumento queryset si desea guardar datos, esto permite que el serializador valide los datos antes de guardarlos en la base de datos
ejemplo
class CouponSerializer(serializers.ModelSerializer): courses = serializers.PrimaryKeyRelatedField( many=True, queryset = Course.objects.all() ) class Meta: model = Coupon exclude = ['users']esto al validar datos si no hay cursos en su lista de cursos generará un error
Django Rest Framework tiene que saber qué conjunto de consultas buscar si el número que el usuario envía en la solicitud es válido.
Digamos que un usuario envía una solicitud POST a su vista que usa este serializador. Con una carga útil como esta:
{ "courses": [1, 2, 3] } Entonces, queremos crear una instancia de Coupon con los courses de campo para que se complete con las instancias de Course con id 1, 2 y 3.
DRF validará esta solicitud para asegurarse de que las claves primarias 1, 2 y 3 existan en el Course modelo. Si no agregamos queryset = Course.objects.all() entonces DRF no sabe en qué modelo mirar.
La razón por la que no tiene que agregar a StringRelatedField es porque ese tipo de campo es de solo lectura de manera predeterminada.
Editar:
Si usa read_only=True , DRF verificará el modelo en el mismo nombre de campo que ha definido en el serializador. En su serializador de ejemplo, ha nombrado los courses campo, por lo que DRF verificará el modelo en busca de un campo llamado courses y sabrá que es un campo de muchos a muchos, por lo que obtendrá todas las claves principales de eso.
Podría preguntarse por qué DRF no hace lo mismo en escritura. Es decir, use el nombre de campo del serializador para averiguar a qué modelo se refiere el campo en el modelo. Sin embargo, no tengo una buena respuesta para esto.