Solución:
Serializador anidado
Puede hacer algo como esto, definir un serializador para Dataitem
que puede reutilizar un serializador del AssetModel
modelo
class AssetModelSerializer(serializers.ModelSerializer):
class Meta:
model = AssetModel
# Fields org and name of AssetModel will be inlcuded by default
class DataitemSerializer(serializers.ModelSerializer):
class Meta:
model = Dataitem
mod = AssetModelSerializer()
# This is the Dataitem.mod field
# which is a FK to AssetModel,
# Now it'll be serilized using the AssetModelSerializer
# and include the org and name fields of AssetModelSerializer
Prefiero este enfoque por el control que obtengo. Si serializa usando lo anterior, obtiene una estructura como esta:
data_item = {'name': ..., 'mod': {'org': ..., 'name': ...}}
^
|___ AssetModel fields
Alternativamente, también puede usar depth = n
También puedes usar depth = 1
en Dataitem
class DataitemSerializer(serializers.ModelSerializer):
class Meta:
model = Dataitem
depth = 1 # Will include fields from related models
# e.g. the mod FK to AssetModel
Serializador anidado grabable
Debido a que el comportamiento de las creaciones y actualizaciones anidadas puede ser ambiguo y puede requerir dependencias complejas entre modelos relacionados, el marco REST 3 requiere que siempre escriba estos métodos explícitamente.
Tenemos que implementar create/update
para hacer esto escribible según la documentación de DRF
class DataitemSerializer(serializers.ModelSerializer):
class Meta:
model = Dataitem
# Nested serializer
mod = AssetModelSerializer()
# Custom create()
def create(self, validated_data):
# First we create 'mod' data for the AssetModel
mod_data = validated_data.pop('mod')
asset_model = AssetModel.objects.create(**mod_data)
# Now we create the Dataitem and set the Dataitem.mod FK
dataitem = Dataitem.objects.create(mod=asset_model, **validated_data)
# Return a Dataitem instance
return dataitem
Parece que hay una biblioteca que hace esto drf-writable-nested
maneja la creación y serialización de estos tipos
- OneToOne (directo / inverso)
- ForeignKey (directo / inverso)
- ManyToMany (directo / inverso excluyendo relaciones m2m con modelo directo)
- GenericRelation (esto siempre es solo inverso)
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)