2014-03-26 38 views
1

我有一个“抽象的”模型类MyField的:Django的REST框架和模型继承

class MyField(models.Model): 
    name = models.CharField(db_index = True, max_length=100) 
    user = models.ForeignKey("AppUser", null=False) 

我有每个MyField的几个其他子类定义了一个特定类型的值。 例如:

class MyBooleanField(MyField): 
    value = models.BooleanField(db_index = True, default=False) 

在MyField的我的方法的get_value()返回基于所述特定的子类的值。

在Django休息,我想获取用户

class AppUserSerializer(serializers.ModelSerializer): 
    appuserfield_set = MyFieldSerializer(many=True) 
    class Meta: 
     model = AppUser 
     fields = ('appuser_id', 'appuserfield_set')  

的各个领域在客户端我希望用户能够添加新字段并设置值,将其再在服务器上我希望能够根据该值创建正确的字段。

实现此行为的正确方法是什么?

回答

1

经过一番挖掘,这里是我最终做的。除了下面的代码,我必须实现get_or_create并根据传递的值创建MyField的相关子类。

class ValueField(serializers.WritableField): 
    #called when serializing a field to a string. (for example when calling seralizer.data) 
    def to_native(self, obj): 
    return obj; 

    """ 
    Called when deserializing a field from a string 
    (for example when calling is_valid which calles restore_object) 
    """ 
    def from_native(self, data): 
    return data 


class MyFieldSerializer(serializers.ModelSerializer): 
    value = ValueField(source='get_value', required=False)  

    def restore_object(self, attrs, instance=None): 
    """ 
    Called by is_valid (before calling save) 
    Create or update a new instance, given a dictionary 
    of deserialized field values. 

    Note that if we don't define this method, then deserializing 
    data will simply return a dictionary of items. 
    """ 
    if instance: 
     # Update existing instance 
     instance.user = attrs.get('user', instance.user) 
     instance.name = attrs.get('name', instance.name) 
    else: 
     # Create new instance 
     instance = MyField.get_or_create(end_user=attrs['user'], 
              name=attrs['name'], 
              value=attrs['get_value'])[0] 

    instance.value = attrs['get_value'] 
    return instance 

    def save_object(self, obj, **kwargs): 
    #called when saving the instance to the DB 
    instance = MyField.get_or_create(end_user=obj.user, 
              name=obj.name, 
              value=obj.value)[0] 
    class Meta: 
    model = MyField 
    fields = ('id', 'user', 'name', 'value')