Django Rest Framework POST请求提示用户名已存在问题求助
问题根因
报错是由模型中username字段的错误配置导致,这两个配置的校验优先级远高于你设置的联合唯一约束:
- 你使用了
OneToOneField类型定义username:该字段本身强制要求每个关联的Volunteer对象只能对应一条VolunteerHours记录,只要同一个username已有记录,不管其他字段值是否不同都会触发唯一校验失败 - 你额外给
username加了primary_key=True配置:Django模型的主键天然自带全局唯一约束,进一步限制了username不能重复
修复步骤
1. 修正模型字段定义
将username字段从OneToOneField改为ForeignKey,同时移除主键配置,让Django自动生成自增ID作为主键,你的联合唯一约束才能生效:
# models.py class VolunteerHours(models.Model): # 改动点:OneToOne → ForeignKey,删除primary_key=True username = models.ForeignKey(Volunteer, models.DO_NOTHING, db_column='Username') date = models.DateField(db_column='Date') hours = models.IntegerField(db_column='Hours') class Meta: managed = False db_table = 'volunteer_hours' unique_together = (('username', 'date', 'hours'),)
注意:因为你设置了managed = False,Django不会自动同步表结构,需要你手动在MySQL中修改表:删除原有Username列的主键约束、唯一约束,新增username、date、hours三个字段的联合唯一约束。
2. (可选)序列化器显式配置联合校验
ModelSerializer默认会自动读取模型的unique_together规则做校验,你也可以显式声明避免异常:
# serializers.py from rest_framework.validators import UniqueTogetherValidator class VolunteerTimesheetSerializer(serializers.ModelSerializer): class Meta: model = models.VolunteerHours fields = '__all__' validators = [ UniqueTogetherValidator( queryset=models.VolunteerHours.objects.all(), fields=['username', 'date', 'hours'] ) ]
修改完成后重启服务即可正常提交同一username、不同date/hours组合的记录。
内容的提问来源于stack exchange,提问作者Jack Barrie
相关产品推荐
相关产品推荐

