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