@@ -589,6 +589,21 @@ class Meta:
589
589
]
590
590
591
591
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
+
592
607
class UniqueConstraintNullableModel (models .Model ):
593
608
title = models .CharField (max_length = 100 )
594
609
age = models .IntegerField (null = True )
@@ -738,6 +753,23 @@ class Meta:
738
753
)
739
754
assert serializer .is_valid ()
740
755
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
+
741
773
742
774
# Tests for `UniqueForDateValidator`
743
775
# ----------------------------------
0 commit comments