json - tutorial - Django: serializadores de anidamiento entre ellos
partial update django rest framework (2)
Debe agregar un modelo que contenga columns
y atributos de data
porque actualmente no están vinculados.
su archivo models.py
:
class Table(models.Model):
pass
class Column(models.Model):
data = models.CharField(max_length=200)
title = models.CharField(max_length=200)
table = models.ForeignKey(Table)
def __str__(self):
return self.order
class Line(models.Model):
doc = models.CharField(max_length=200)
order = models.CharField(max_length=200)
nothing = models.CharField(max_length=200)
table = models.ForeignKey(Table)
def __str__(self):
return self.order
su archivo serializer.py
:
# import your related models and serializers
class ColumnSerializer(serializers.ModelSerializer):
class Meta:
model = Column
fields = [
''data'',
''title''
]
class LineSerializer(serializers.ModelSerializer):
class Meta:
model = Line
fields = [
''doc'',
''order'',
''nothing''
]
class TableSerializer(serializers.ModelSerializer):
columns = ColumnSerializer(many=True)
lines = LineSerializer(many=True)
class Meta:
model = Table
fields = [
''columns'',
''lines''
]
Ahora use el serializador TableSerializer
para serializar y deserializar su objeto Table
.
Con respecto a sus modelos, Line
lugar de Data
es quizás más apropiado. Y
Lea Django-Rest-Framework - NestedRelationships para obtener más información y aprenda cómo admitir las operaciones de escritura en un campo de serializador anidado.
Estoy averiguando cómo los serializadores se pueden fusionar o anidar el uno al otro. En este ejemplo, tengo un modelo de columna (que consiste en una clase de Column
) y datos que pertenecen al modelo de columna (que consiste en Data class
de Data class
). Mi problema es que no sé cómo llamar a ModelSerializer desde otra clase de serializador y pasar los argumentos (el resultado siempre está vacío).
¿Puede aconsejarme si mi modelo es correcto para esta situación y cómo crear el JSON deseado para que el resultado reutilice los serializadores existentes y evite la duplicación de datos?
Nota: en el mejor de los casos, los atributos de los datos deben ser dependientes entre sí, de modo que solo esos datos se serialicen y se definan como columnas.
models.py
class Column(models.Model):
data = models.CharField(max_length=200)
title = models.CharField(max_length=200)
def __str__(self):
return self.order
class Data(models.Model):
doc = models.CharField(max_length=200)
order = models.CharField(max_length=200)
nothing = models.CharField(max_length=200)
def __str__(self):
return self.order
Salida deseada:
{
"columns": [
{
"data": "doc",
"title": "Doc."
},
{
"data": "order",
"title": "Order no."
},
{
"data": "nothing",
"title": "Nothing"
}
],
"data": [
{
"doc": "564251422",
"nothing": 0.0,
"order": "56421"
},
{
"doc": "546546545",
"nothing": 0.0,
"order": "98745"
}
]
}
Pero el resultado con ModelSerializer es así:
[
{
"doc": "564251422",
"order": "56421",
"nothing": "0.0"
},
{
"doc": "546546545",
"order": "98745",
"nothing": "0.0"
}
]
Primero necesitas modificar tus modelos. Puede hacer data
campo ForeignKey
data
en el modelo de Column
similar a:
class Column(models.Model):
data = models.ForeignKey("Data")
title = models.CharField(max_length=200)
Luego crea un nuevo serializador para Data
como:
class DataSerializer(serializers.ModelSerializer):
class Meta:
model = Data
Ahora puede usar DataSerializer
en ColumnSerializer
para obtener datos para cada columna como:
class ColumnSerializer(serializers.ModelSerializer):
data = DataSerializer(read_only=True)
class Meta:
model = Column
Esto daría salida como:
[
{
"title" : "Doc",
"data" :{
"doc": "564251422",
"nothing": 0.0,
"order": "56421"
}
},
{
"title" : "Order no.",
"data" :{
"doc": "546546545",
"nothing": 0.0,
"order": "98745"
}
}
]