str proyecto plantillas modelos hacer ejemplos def create crear consultas como avanzadas django django-rest-framework

proyecto - filter django



Campo adicional al serializar el marco de descanso django (3)

SerializerMethodField funciona bien, y también podemos almacenar datos en el objeto del serializador y dejar que el método get_field_name use.

Ejemplo:

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, {})

Soy un novato en el marco de descanso de django y he creado un ejemplo de modelo de Employee .

Mi 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)

Mi serializers.py :

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

Esto funciona bien, pero quiero un campo adicional full_name , que será first_name + last_name .

¿Cómo puedo definir este nuevo campo full_name en mi serializers.py ?


Siempre que el Employee sea ​​un usuario de inicio de sesión, entonces la mayoría de nosotros usará django.auth.User , voy a compartir cómo se puede implementar Employee como otro Profile (extensión del usuario django). También con la adición de full_name.read_only , first_name.write_only y 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


Veo dos formas aquí (prefiero la primera, ya que puedes reutilizarla en otras partes de la aplicación):

agregue una propiedad calculada a su modelo y agréguela a su serializador utilizando un campo de solo lectura con 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'')

mediante el uso de SerializerMethodField (su modelo sin cambios)

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'')