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):
|
class ForeignKeySource(RESTFrameworkModel):
|
||||||
name = models.CharField(max_length=100)
|
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
|
# Nullable ForeignKey
|
||||||
class NullableForeignKeySource(RESTFrameworkModel):
|
class NullableForeignKeySource(RESTFrameworkModel):
|
||||||
name = models.CharField(max_length=100)
|
name = models.CharField(max_length=100)
|
||||||
target = models.ForeignKey(ForeignKeyTarget, null=True, blank=True,
|
target = models.ForeignKey(ForeignKeyTarget, null=True, blank=True,
|
||||||
related_name='nullable_sources')
|
related_name='nullable_sources',
|
||||||
|
verbose_name='Optional target object')
|
||||||
|
|
||||||
|
|
||||||
# OneToOne
|
# OneToOne
|
||||||
|
|
|
@ -5,6 +5,7 @@ from django.test import TestCase
|
||||||
from rest_framework import generics, renderers, serializers, status
|
from rest_framework import generics, renderers, serializers, status
|
||||||
from rest_framework.test import APIRequestFactory
|
from rest_framework.test import APIRequestFactory
|
||||||
from rest_framework.tests.models import BasicModel, Comment, SlugBasedModel
|
from rest_framework.tests.models import BasicModel, Comment, SlugBasedModel
|
||||||
|
from rest_framework.tests.models import ForeignKeySource, ForeignKeyTarget
|
||||||
from rest_framework.compat import six
|
from rest_framework.compat import six
|
||||||
|
|
||||||
factory = APIRequestFactory()
|
factory = APIRequestFactory()
|
||||||
|
@ -28,6 +29,13 @@ class InstanceView(generics.RetrieveUpdateDestroyAPIView):
|
||||||
return queryset.exclude(text='filtered out')
|
return queryset.exclude(text='filtered out')
|
||||||
|
|
||||||
|
|
||||||
|
class FKInstanceView(generics.RetrieveUpdateDestroyAPIView):
|
||||||
|
"""
|
||||||
|
FK: example description for OPTIONS.
|
||||||
|
"""
|
||||||
|
model = ForeignKeySource
|
||||||
|
|
||||||
|
|
||||||
class SlugSerializer(serializers.ModelSerializer):
|
class SlugSerializer(serializers.ModelSerializer):
|
||||||
slug = serializers.Field() # read only
|
slug = serializers.Field() # read only
|
||||||
|
|
||||||
|
@ -407,6 +415,71 @@ class TestInstanceView(TestCase):
|
||||||
self.assertFalse(self.objects.filter(id=999).exists())
|
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):
|
class TestOverriddenGetObject(TestCase):
|
||||||
"""
|
"""
|
||||||
Test cases for a RetrieveUpdateDestroyAPIView that does NOT use the
|
Test cases for a RetrieveUpdateDestroyAPIView that does NOT use the
|
||||||
|
|
Loading…
Reference in New Issue
Block a user