4
4
from django .test import TestCase
5
5
6
6
from rest_framework import serializers
7
+ from rest_framework .validators import UniqueValidator
7
8
8
9
9
10
def dedent (blocktext ):
@@ -22,6 +23,20 @@ class Meta:
22
23
model = UniquenessModel
23
24
24
25
26
+ class RelatedModel (models .Model ):
27
+ user = models .OneToOneField (UniquenessModel , on_delete = models .CASCADE )
28
+ email = models .CharField (unique = True , max_length = 80 )
29
+
30
+
31
+ class RelatedModelSerializer (serializers .ModelSerializer ):
32
+ username = serializers .CharField (source = 'user.username' ,
33
+ validators = [UniqueValidator (queryset = UniquenessModel .objects .all ())]) # NOQA
34
+
35
+ class Meta :
36
+ model = RelatedModel
37
+ fields = ('username' , 'email' )
38
+
39
+
25
40
class AnotherUniquenessModel (models .Model ):
26
41
code = models .IntegerField (unique = True )
27
42
@@ -73,6 +88,16 @@ def test_doesnt_pollute_model(self):
73
88
self .assertEqual (
74
89
AnotherUniquenessModel ._meta .get_field ('code' ).validators , [])
75
90
91
+ def test_related_model_is_unique (self ):
92
+ data = {
'username' :
'existing' ,
'email' :
'[email protected] ' }
93
+ rs = RelatedModelSerializer (data = data )
94
+ self .assertFalse (rs .is_valid ())
95
+ self .assertEqual (rs .errors ,
96
+ {'username' : ['This field must be unique.' ]})
97
+ data = {
'username' :
'new-username' ,
'email' :
'[email protected] ' }
98
+ rs = RelatedModelSerializer (data = data )
99
+ self .assertTrue (rs .is_valid ())
100
+
76
101
77
102
# Tests for `UniqueTogetherValidator`
78
103
# -----------------------------------
0 commit comments