mirror of
				https://github.com/encode/django-rest-framework.git
				synced 2025-10-30 23:47:53 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			101 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """
 | |
| General tests for relational fields.
 | |
| """
 | |
| from __future__ import unicode_literals
 | |
| from django.db import models
 | |
| from django.test import TestCase
 | |
| from rest_framework import serializers
 | |
| from rest_framework.tests.models import BlogPost
 | |
| 
 | |
| 
 | |
| class NullModel(models.Model):
 | |
|     pass
 | |
| 
 | |
| 
 | |
| class FieldTests(TestCase):
 | |
|     def test_pk_related_field_with_empty_string(self):
 | |
|         """
 | |
|         Regression test for #446
 | |
| 
 | |
|         https://github.com/tomchristie/django-rest-framework/issues/446
 | |
|         """
 | |
|         field = serializers.PrimaryKeyRelatedField(queryset=NullModel.objects.all())
 | |
|         self.assertRaises(serializers.ValidationError, field.from_native, '')
 | |
|         self.assertRaises(serializers.ValidationError, field.from_native, [])
 | |
| 
 | |
|     def test_hyperlinked_related_field_with_empty_string(self):
 | |
|         field = serializers.HyperlinkedRelatedField(queryset=NullModel.objects.all(), view_name='')
 | |
|         self.assertRaises(serializers.ValidationError, field.from_native, '')
 | |
|         self.assertRaises(serializers.ValidationError, field.from_native, [])
 | |
| 
 | |
|     def test_slug_related_field_with_empty_string(self):
 | |
|         field = serializers.SlugRelatedField(queryset=NullModel.objects.all(), slug_field='pk')
 | |
|         self.assertRaises(serializers.ValidationError, field.from_native, '')
 | |
|         self.assertRaises(serializers.ValidationError, field.from_native, [])
 | |
| 
 | |
| 
 | |
| class TestManyRelatedMixin(TestCase):
 | |
|     def test_missing_many_to_many_related_field(self):
 | |
|         '''
 | |
|         Regression test for #632
 | |
| 
 | |
|         https://github.com/tomchristie/django-rest-framework/pull/632
 | |
|         '''
 | |
|         field = serializers.RelatedField(many=True, read_only=False)
 | |
| 
 | |
|         into = {}
 | |
|         field.field_from_native({}, None, 'field_name', into)
 | |
|         self.assertEqual(into['field_name'], [])
 | |
| 
 | |
| 
 | |
| # Regression tests for #694 (`source` attribute on related fields)
 | |
| 
 | |
| class RelatedFieldSourceTests(TestCase):
 | |
|     def test_related_manager_source(self):
 | |
|         """
 | |
|         Relational fields should be able to use manager-returning methods as their source.
 | |
|         """
 | |
|         BlogPost.objects.create(title='blah')
 | |
|         field = serializers.RelatedField(many=True, source='get_blogposts_manager')
 | |
| 
 | |
|         class ClassWithManagerMethod(object):
 | |
|             def get_blogposts_manager(self):
 | |
|                 return BlogPost.objects
 | |
| 
 | |
|         obj = ClassWithManagerMethod()
 | |
|         value = field.field_to_native(obj, 'field_name')
 | |
|         self.assertEqual(value, ['BlogPost object'])
 | |
| 
 | |
|     def test_related_queryset_source(self):
 | |
|         """
 | |
|         Relational fields should be able to use queryset-returning methods as their source.
 | |
|         """
 | |
|         BlogPost.objects.create(title='blah')
 | |
|         field = serializers.RelatedField(many=True, source='get_blogposts_queryset')
 | |
| 
 | |
|         class ClassWithQuerysetMethod(object):
 | |
|             def get_blogposts_queryset(self):
 | |
|                 return BlogPost.objects.all()
 | |
| 
 | |
|         obj = ClassWithQuerysetMethod()
 | |
|         value = field.field_to_native(obj, 'field_name')
 | |
|         self.assertEqual(value, ['BlogPost object'])
 | |
| 
 | |
|     def test_dotted_source(self):
 | |
|         """
 | |
|         Source argument should support dotted.source notation.
 | |
|         """
 | |
|         BlogPost.objects.create(title='blah')
 | |
|         field = serializers.RelatedField(many=True, source='a.b.c')
 | |
| 
 | |
|         class ClassWithQuerysetMethod(object):
 | |
|             a = {
 | |
|                 'b': {
 | |
|                     'c': BlogPost.objects.all()
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|         obj = ClassWithQuerysetMethod()
 | |
|         value = field.field_to_native(obj, 'field_name')
 | |
|         self.assertEqual(value, ['BlogPost object'])
 |