2013-12-15 18 views
0

我有類似這樣的一個問題:Additional (non model) fields in ModelSerializer在ModelSerializer其他信息不在使用型號

我想創建一個對象,具有這樣的modelserializer:

class CreateUserSerializer(serializers.ModelSerializer): 
    user = serializers.CharField(source="username") 
    password = serializers.CharField() 
    password2 = serializers.WritableField() 
    ... 

    class Meta: 
     model = User 
    fields = ('user', "password", "password2", ...) 

很顯然,我不是有興趣保存密碼2,這只是爲了比較。

理想這應該做的伎倆,但對於原因,其沒有按預期工作:

def restore_object(self, attrs, instance=None): 
    tags = attrs.pop('password2', None) 
    obj = super(CreateUserSerializer, self).restore_object(attrs, instance) 
    obj.tags = tags 
    logging.info(u"Object gets restored, field 'password2' gets removed, list with arguments for object: {0}".format(tags)) 
    return obj 

我得到的錯誤是:

'User' object has no attribute 'password2' 
... 
/home/jan/projekte/alarmapp/eclipse_workspace/AlarmServer/AlarmApp/src/external/rest_framework/fields.py in get_component 

55. val = getattr(obj, attr_name) 

任何想法,爲什麼這是不工作?

回答

0

好像this small Gist應該是有幫助的:

from django.contrib.auth.models import User 
from rest_framework import serializers 

class CreateUserSerializer(serializers.ModelSerializer): 
    password2 = serializers.CharField() 

    def validate_password2(self, attrs, source): 
     password2 = attrs.pop(source) 
     if attrs['password'] != password2: 
      raise serializers.ValidationError('password mismatch') 
     return attrs 

    def to_native(self, obj): 
     self.fields.pop('password2') 
     return super(CreateUserSerializer, self).to_native(obj) 

    class Meta: 
     model = User