DJANGO REST API:非空约束失败
我正在DJANGO REST API中开发一个用户首选项视图集,用户可以在更新首选项的同时获得一个首选项列表。在Postman中,我可以获取用户的首选项,但当我转到“put”时,我会得到以下错误:完整性错误--非空约束失败:pugorugh_userpref.age--发生这种情况的原因是什么 UserPref模型如下所示:DJANGO REST API:非空约束失败,django,rest,Django,Rest,我正在DJANGO REST API中开发一个用户首选项视图集,用户可以在更新首选项的同时获得一个首选项列表。在Postman中,我可以获取用户的首选项,但当我转到“put”时,我会得到以下错误:完整性错误--非空约束失败:pugorugh_userpref.age--发生这种情况的原因是什么 UserPref模型如下所示: class UserPref(models.Model): user = models.ForeignKey(User) age = models.Char
class UserPref(models.Model):
user = models.ForeignKey(User)
age = models.CharField(choices=AGE, max_length=7, default='b,y,a,s')
gender = models.CharField(choices=GENDER_PREF, max_length=3, default='m,f')
size = models.CharField(choices=SIZE_PREF, max_length=8, default='s,m,l,xl')
def __str__(self):
return '{} preferences'.format(self.user)
def create_user_preference(sender, **kwargs):
user = kwargs['instance']
if kwargs['created']:
user_pref = UserPref(user=user)
user_pref.save()
post_save.connect(create_user_preference, sender=User)
这是我的视图集:
class UserPrefViewSet(
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
viewsets.GenericViewSet):
"""View to get and update User Preferences."""
permission_classes = (permissions.IsAuthenticated,)
queryset = models.UserPref.objects.all()
serializer_class = serializers.UserPrefSerializer
# /api/user/preferences/
@list_route(methods=['get', 'put'])
def preferences(self, request, pk=None):
user = request.user
user_pref = models.UserPref.objects.get(user=user)
if request.method == 'PUT':
data = request.data
user_pref.age = data.get('age')
user_pref.gender = data.get('gender')
user_pref.size = data.get('size')
user_pref.save()
serializer = serializers.UserPrefSerializer(user_pref)
return Response(serializer.data)
和序列化程序
class UserPrefSerializer(serializers.ModelSerializer):
extra_kwargs = {
'user': {'write_only': True}
}
class Meta:
fields = (
'age',
'gender',
'size'
)
model = models.UserPref
看起来PUT数据不包含
age
值。由于age
字段不可为空,空白的age值将引发错误。
尝试修复此问题:
user_pref.age = data.get('age') or user_pref.age
...
user_pref.save()
如果值不在请求数据中,则允许不更改age