mirror of
https://github.com/encode/django-rest-framework.git
synced 2024-11-29 04:54:00 +03:00
fix read_only related field metadata
This commit is contained in:
parent
d4dd22ff1c
commit
a97c989248
|
@ -127,7 +127,7 @@ class SimpleMetadata(BaseMetadata):
|
||||||
if value is not None and value != '':
|
if value is not None and value != '':
|
||||||
field_info[attr] = force_text(value, strings_only=True)
|
field_info[attr] = force_text(value, strings_only=True)
|
||||||
|
|
||||||
if hasattr(field, 'choices'):
|
if not field_info.get('read_only') and hasattr(field, 'choices'):
|
||||||
field_info['choices'] = [
|
field_info['choices'] = [
|
||||||
{
|
{
|
||||||
'value': choice_value,
|
'value': choice_value,
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
from django.db import models
|
||||||
|
from django.test import TestCase
|
||||||
|
from django.core.validators import MinValueValidator, MaxValueValidator
|
||||||
from rest_framework import exceptions, metadata, serializers, status, views, versioning
|
from rest_framework import exceptions, metadata, serializers, status, views, versioning
|
||||||
from rest_framework.request import Request
|
from rest_framework.request import Request
|
||||||
from rest_framework.renderers import BrowsableAPIRenderer
|
from rest_framework.renderers import BrowsableAPIRenderer
|
||||||
|
@ -212,3 +215,83 @@ class TestMetadata:
|
||||||
options = metadata.SimpleMetadata()
|
options = metadata.SimpleMetadata()
|
||||||
field_info = options.get_field_info(serializers.NullBooleanField())
|
field_info = options.get_field_info(serializers.NullBooleanField())
|
||||||
assert field_info['type'] == 'boolean'
|
assert field_info['type'] == 'boolean'
|
||||||
|
|
||||||
|
|
||||||
|
class TestModelSerializerMetadata(TestCase):
|
||||||
|
def test_read_only_primary_key_related_field(self):
|
||||||
|
"""
|
||||||
|
On generic views OPTIONS should return an 'actions' key with metadata
|
||||||
|
on the fields that may be supplied to PUT and POST requests. It should
|
||||||
|
not fail when a read_only PrimaryKeyRelatedField is present
|
||||||
|
"""
|
||||||
|
class Parent(models.Model):
|
||||||
|
integer_field = models.IntegerField(validators=[MinValueValidator(1), MaxValueValidator(1000)])
|
||||||
|
children = models.ManyToManyField('Child')
|
||||||
|
name = models.CharField(max_length=100, blank=True, null=True)
|
||||||
|
|
||||||
|
class Child(models.Model):
|
||||||
|
name = models.CharField(max_length=100)
|
||||||
|
|
||||||
|
class ExampleSerializer(serializers.ModelSerializer):
|
||||||
|
children = serializers.PrimaryKeyRelatedField(read_only=True, many=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Parent
|
||||||
|
|
||||||
|
class ExampleView(views.APIView):
|
||||||
|
"""Example view."""
|
||||||
|
def post(self, request):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def get_serializer(self):
|
||||||
|
return ExampleSerializer()
|
||||||
|
|
||||||
|
view = ExampleView.as_view()
|
||||||
|
response = view(request=request)
|
||||||
|
expected = {
|
||||||
|
'name': 'Example',
|
||||||
|
'description': 'Example view.',
|
||||||
|
'renders': [
|
||||||
|
'application/json',
|
||||||
|
'text/html'
|
||||||
|
],
|
||||||
|
'parses': [
|
||||||
|
'application/json',
|
||||||
|
'application/x-www-form-urlencoded',
|
||||||
|
'multipart/form-data'
|
||||||
|
],
|
||||||
|
'actions': {
|
||||||
|
'POST': {
|
||||||
|
'id': {
|
||||||
|
'type': 'integer',
|
||||||
|
'required': False,
|
||||||
|
'read_only': True,
|
||||||
|
'label': 'ID'
|
||||||
|
},
|
||||||
|
'children': {
|
||||||
|
'type': 'field',
|
||||||
|
'required': False,
|
||||||
|
'read_only': True,
|
||||||
|
'label': 'Children'
|
||||||
|
},
|
||||||
|
'integer_field': {
|
||||||
|
'type': 'integer',
|
||||||
|
'required': True,
|
||||||
|
'read_only': False,
|
||||||
|
'label': 'Integer field',
|
||||||
|
'min_value': 1,
|
||||||
|
'max_value': 1000
|
||||||
|
},
|
||||||
|
'name': {
|
||||||
|
'type': 'string',
|
||||||
|
'required': False,
|
||||||
|
'read_only': False,
|
||||||
|
'label': 'Name',
|
||||||
|
'max_length': 100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assert response.status_code == status.HTTP_200_OK
|
||||||
|
assert response.data == expected
|
||||||
|
|
Loading…
Reference in New Issue
Block a user