@@ -616,6 +616,32 @@ class Meta:
616616 ]
617617
618618
619+ class UniqueConstraintCustomMessageCodeModel (models .Model ):
620+ username = models .CharField (max_length = 32 )
621+ company_id = models .IntegerField ()
622+ role = models .CharField (max_length = 32 )
623+
624+ class Meta :
625+ constraints = [
626+ models .UniqueConstraint (
627+ fields = ("username" , "company_id" ),
628+ name = "unique_username_company_custom_msg" ,
629+ violation_error_message = "Username must be unique within a company." ,
630+ violation_error_code = "duplicate_username" ,
631+ )
632+ if django_version [0 ] >= 5
633+ else models .UniqueConstraint (
634+ fields = ("username" , "company_id" ),
635+ name = "unique_username_company_custom_msg" ,
636+ violation_error_message = "Username must be unique within a company." ,
637+ ),
638+ models .UniqueConstraint (
639+ fields = ("company_id" , "role" ),
640+ name = "unique_company_role_default_msg" ,
641+ ),
642+ ]
643+
644+
619645class UniqueConstraintSerializer (serializers .ModelSerializer ):
620646 class Meta :
621647 model = UniqueConstraintModel
@@ -628,6 +654,12 @@ class Meta:
628654 fields = ('title' , 'age' , 'tag' )
629655
630656
657+ class UniqueConstraintCustomMessageCodeSerializer (serializers .ModelSerializer ):
658+ class Meta :
659+ model = UniqueConstraintCustomMessageCodeModel
660+ fields = ('username' , 'company_id' , 'role' )
661+
662+
631663class TestUniqueConstraintValidation (TestCase ):
632664 def setUp (self ):
633665 self .instance = UniqueConstraintModel .objects .create (
@@ -778,6 +810,31 @@ class Meta:
778810 )
779811 assert serializer .is_valid ()
780812
813+ def test_unique_constraint_custom_message_code (self ):
814+ UniqueConstraintCustomMessageCodeModel .objects .create (username = "Alice" , company_id = 1 , role = "member" )
815+ expected_code = "duplicate_username" if django_version [0 ] >= 5 else UniqueTogetherValidator .code
816+
817+ serializer = UniqueConstraintCustomMessageCodeSerializer (data = {
818+ "username" : "Alice" ,
819+ "company_id" : 1 ,
820+ "role" : "admin" ,
821+ })
822+ assert not serializer .is_valid ()
823+ assert serializer .errors == {"non_field_errors" : ["Username must be unique within a company." ]}
824+ assert serializer .errors ["non_field_errors" ][0 ].code == expected_code
825+
826+ def test_unique_constraint_default_message_code (self ):
827+ UniqueConstraintCustomMessageCodeModel .objects .create (username = "Alice" , company_id = 1 , role = "member" )
828+ serializer = UniqueConstraintCustomMessageCodeSerializer (data = {
829+ "username" : "John" ,
830+ "company_id" : 1 ,
831+ "role" : "member" ,
832+ })
833+ expected_message = UniqueTogetherValidator .message .format (field_names = ', ' .join (("company_id" , "role" )))
834+ assert not serializer .is_valid ()
835+ assert serializer .errors == {"non_field_errors" : [expected_message ]}
836+ assert serializer .errors ["non_field_errors" ][0 ].code == UniqueTogetherValidator .code
837+
781838
782839# Tests for `UniqueForDateValidator`
783840# ----------------------------------
0 commit comments