mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-02-02 20:54:42 +03:00
Metadata for related fields -- added test case.
This commit is contained in:
parent
ab5082d15c
commit
d8bf878792
|
@ -143,14 +143,16 @@ class ForeignKeyTarget(RESTFrameworkModel):
|
|||
|
||||
class ForeignKeySource(RESTFrameworkModel):
|
||||
name = models.CharField(max_length=100)
|
||||
target = models.ForeignKey(ForeignKeyTarget, related_name='sources')
|
||||
target = models.ForeignKey(ForeignKeyTarget, related_name='sources',
|
||||
verbose_name='Target object')
|
||||
|
||||
|
||||
# Nullable ForeignKey
|
||||
class NullableForeignKeySource(RESTFrameworkModel):
|
||||
name = models.CharField(max_length=100)
|
||||
target = models.ForeignKey(ForeignKeyTarget, null=True, blank=True,
|
||||
related_name='nullable_sources')
|
||||
related_name='nullable_sources',
|
||||
verbose_name='Optional target object')
|
||||
|
||||
|
||||
# OneToOne
|
||||
|
|
|
@ -5,6 +5,7 @@ from django.test import TestCase
|
|||
from rest_framework import generics, renderers, serializers, status
|
||||
from rest_framework.test import APIRequestFactory
|
||||
from rest_framework.tests.models import BasicModel, Comment, SlugBasedModel
|
||||
from rest_framework.tests.models import ForeignKeySource, ForeignKeyTarget
|
||||
from rest_framework.compat import six
|
||||
|
||||
factory = APIRequestFactory()
|
||||
|
@ -28,6 +29,13 @@ class InstanceView(generics.RetrieveUpdateDestroyAPIView):
|
|||
return queryset.exclude(text='filtered out')
|
||||
|
||||
|
||||
class FKInstanceView(generics.RetrieveUpdateDestroyAPIView):
|
||||
"""
|
||||
FK: example description for OPTIONS.
|
||||
"""
|
||||
model = ForeignKeySource
|
||||
|
||||
|
||||
class SlugSerializer(serializers.ModelSerializer):
|
||||
slug = serializers.Field() # read only
|
||||
|
||||
|
@ -407,6 +415,71 @@ class TestInstanceView(TestCase):
|
|||
self.assertFalse(self.objects.filter(id=999).exists())
|
||||
|
||||
|
||||
class TestFKInstanceView(TestCase):
|
||||
def setUp(self):
|
||||
"""
|
||||
Create 3 BasicModel instances.
|
||||
"""
|
||||
items = ['foo', 'bar', 'baz']
|
||||
for item in items:
|
||||
t = ForeignKeyTarget(name=item)
|
||||
t.save()
|
||||
ForeignKeySource(name='source_' + item, target=t).save()
|
||||
|
||||
self.objects = ForeignKeySource.objects
|
||||
self.data = [
|
||||
{'id': obj.id, 'name': obj.name}
|
||||
for obj in self.objects.all()
|
||||
]
|
||||
self.view = FKInstanceView.as_view()
|
||||
|
||||
def test_options_root_view(self):
|
||||
"""
|
||||
OPTIONS requests to ListCreateAPIView should return metadata
|
||||
"""
|
||||
request = factory.options('/999')
|
||||
with self.assertNumQueries(1):
|
||||
response = self.view(request, pk=999).render()
|
||||
expected = {
|
||||
'name': 'Fk Instance',
|
||||
'description': 'FK: example description for OPTIONS.',
|
||||
'renders': [
|
||||
'application/json',
|
||||
'text/html'
|
||||
],
|
||||
'parses': [
|
||||
'application/json',
|
||||
'application/x-www-form-urlencoded',
|
||||
'multipart/form-data'
|
||||
],
|
||||
'actions': {
|
||||
'PUT': {
|
||||
'id': {
|
||||
'type': 'integer',
|
||||
'required': False,
|
||||
'read_only': True,
|
||||
'label': u'ID'
|
||||
},
|
||||
'name': {
|
||||
'type': 'string',
|
||||
'required': True,
|
||||
'read_only': False,
|
||||
'label': 'name',
|
||||
'max_length': 100
|
||||
},
|
||||
'target': {
|
||||
'type': 'field',
|
||||
'required': True,
|
||||
'read_only': False,
|
||||
'label': 'Target object'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||
self.assertEqual(response.data, expected)
|
||||
|
||||
|
||||
class TestOverriddenGetObject(TestCase):
|
||||
"""
|
||||
Test cases for a RetrieveUpdateDestroyAPIView that does NOT use the
|
||||
|
|
Loading…
Reference in New Issue
Block a user