Saltar al contenido

¿Serializador anidado escribible en django-rest-framework?

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)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *