2014-03-27 53 views
25

我是Django休息框架的新手,并创建了一个样本Employee模型。序列化Django的其他领域休息框架

models.py

class Employees(models.Model): 
    created = models.DateTimeField(auto_now_add=True) 
    first_name = models.CharField(max_length=100) 
    last_name = models.CharField(max_length=100) 

serializers.py

class EmployeeSerializer(serializers.Serializer): 
    class Meta: 
     model = Employees 
     fields = ('first_name','last_name') 

这工作得很好,但我希望有一个附加字段full_name,这将是first_name + last_name

如何在我的serializers.py中定义这个新字段full_name

回答

40

我在这里看到两种方式(我更喜欢第一种方式,因为你可以重复使用它在应用程序的其他部分):

计算的属性添加到您的模型,利用 它添加到您的串行a readonly field with source=

# models.py 
class Employees(models.Model): 
    created = models.DateTimeField(auto_now_add=True) 
    first_name = models.CharField(max_length=100) 
    last_name = models.CharField(max_length=100) 

    @property 
    def full_name(self): 
     return self.first_name + self.last_name 

#serializes.py 
class EmployeeSerializer(serializers.ModelSerializer): 
    full_name = serializers.Field(source='full_name') 

    class Meta: 
     model = Employees 
     fields = ('first_name','last_name', 'full_name') 

使用SerializerMethodField (模型不变)

class EmployeeSerializer(serializers.ModelSerializer): 
    full_name = serializers.SerializerMethodField('get_full_name') 

    def get_full_name(self, obj): 
     return obj.first_name + obj.last_name 

    class Meta: 
     model = Employees 
     fields = ('first_name','last_name', 'full_name') 
+5

对于我来说,使用'serializers.Field'给了一个错误。如果'to_representation'没有被定义并且视图是只读的''serializers.ReadOnlyField' does not work。 – Altaisoft

+1

我刚刚有同样的问题(我没有序列化一个Django模型,但另一个普通类),并且在一段时间之后,我的头撞上了它,发现它工作正常,如果您使用'full_name = serializers.ReadOnlyField )',即完全丢弃'source'参数。正如[documentation说](http://www.django-rest-framework.org/api-guide/fields/)关于'source'参数:它默认为字段的名称。 Ans即使它是一种方法(或属性) – Pynchia

4

前提是Employee是登录用户,那么大多数人会使用django.auth.User,我将分享如何Employee可以作为另一个Profile(扩展的Django用户的)来实现。另外随着加入full_name.read_onlyfirst_name.write_only,并last_name.write_only

# models.py 
class Employee(models.Model): 
    """User Profile Model""" 
    user = models.OneToOneField('auth.User') 

# serializers.py 
class EmployeeSerializer(serializers.HyperlinkedModelSerializer): 
    username = serializers.CharField(source='user.username') 
    email = serializers.EmailField(source='user.email') 

    first_name = serializers.CharField(
      source='user.first_name', write_only=True) 
    last_name = serializers.CharField(
      source='user.last_name', write_only=True) 
    name = serializers.CharField(
      source='user.get_full_name', read_only=True) 


    class Meta: 
     model = Employee 
     fields = (
      'url', 'username', 'email', 
      'first_name', 'last_name', 'name') 
     depth = 1 
2

SerializerMethodField正常工作,同时我们也可以将数据存储在串行对象,并让方法get_field_name使用。

例子:

class MySerializer(serializers.ModelSerializer): 
    statistic = serializers.SerializerMethodField() 

    def __init__(self, instance=None, data=serializers.empty, statistic=None, **kwargs): 
     super(MySerializer, self).__init__(instance=instance, data=data, **kwargs) 
     self.statistic = statistic 

    def get_statistic(self, obj): 
     if self.statistic is None: 
      return serializers.empty 
     return self.statistic.get(obj.id, {})