@@ -616,6 +616,32 @@ class Meta:
616
616
]
617
617
618
618
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
+
619
645
class UniqueConstraintSerializer (serializers .ModelSerializer ):
620
646
class Meta :
621
647
model = UniqueConstraintModel
@@ -628,6 +654,12 @@ class Meta:
628
654
fields = ('title' , 'age' , 'tag' )
629
655
630
656
657
+ class UniqueConstraintCustomMessageCodeSerializer (serializers .ModelSerializer ):
658
+ class Meta :
659
+ model = UniqueConstraintCustomMessageCodeModel
660
+ fields = ('username' , 'company_id' , 'role' )
661
+
662
+
631
663
class TestUniqueConstraintValidation (TestCase ):
632
664
def setUp (self ):
633
665
self .instance = UniqueConstraintModel .objects .create (
@@ -778,6 +810,31 @@ class Meta:
778
810
)
779
811
assert serializer .is_valid ()
780
812
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
+
781
838
782
839
# Tests for `UniqueForDateValidator`
783
840
# ----------------------------------
0 commit comments