@@ -589,6 +589,21 @@ class Meta:
589589 ]
590590
591591
592+ class UniqueConstraintReadOnlyFieldModel (models .Model ):
593+ state = models .CharField (max_length = 100 , default = "new" )
594+ position = models .IntegerField ()
595+ something = models .IntegerField ()
596+
597+ class Meta :
598+ constraints = [
599+ models .UniqueConstraint (
600+ name = "unique_constraint_%(class)s" ,
601+ fields = ("position" , "something" ),
602+ condition = models .Q (state = "new" ),
603+ ),
604+ ]
605+
606+
592607class UniqueConstraintNullableModel (models .Model ):
593608 title = models .CharField (max_length = 100 )
594609 age = models .IntegerField (null = True )
@@ -738,6 +753,23 @@ class Meta:
738753 )
739754 assert serializer .is_valid ()
740755
756+ def test_uniq_constraint_condition_read_only (self ):
757+ class UniqueConstraintReadOnlyFieldModelSerializer (serializers .ModelSerializer ):
758+ class Meta :
759+ model = UniqueConstraintReadOnlyFieldModel
760+ read_only_fields = ("state" ,)
761+ fields = ("position" , "something" , * read_only_fields )
762+
763+ serializer = UniqueConstraintReadOnlyFieldModelSerializer (
764+ data = {"position" : 1 , "something" : 1 }
765+ )
766+ assert serializer .is_valid ()
767+ UniqueConstraintReadOnlyFieldModel .objects .create (position = 1 , something = 1 )
768+ serializer = UniqueConstraintReadOnlyFieldModelSerializer (
769+ data = {"position" : 1 , "something" : 1 }
770+ )
771+ assert not serializer .is_valid ()
772+
741773
742774# Tests for `UniqueForDateValidator`
743775# ----------------------------------
0 commit comments