web-dev-qa-db-fra.com

Comment changer le nom du champ dans Django REST Framework

J'essaie de changer le nom du champ Modèle dans le sérialiseur DRF comme un alias dans SQL. J'ai essayé différentes méthodes mais je ne peux pas y arriver.

models.py

class Park(models.Model):
    name = models.CharField(max_length=256)
    alternate_name = models.CharField(max_length=256, blank=True)
    objects = models.GeoManager()

    class Meta:
        db_table = u'p_park'

    def __unicode__(self):
        return '%s' % self.name

    def alias_alternate_name(self):
        return self.alternate_name

serializers.py

class ParkSerializer(serializers.ModelSerializer):

    location = serializers.Field(source='alias_alternate_name')
    #location = serializers.SerializerMethodField(source='alias_alternate_name')

    #alternate_name as location


    class Meta:
        model = Park
        fields = ('id', 'name', 'location')

J'ai aussi essayé d'ajouter un alias dans Django Queryset mais je ne peux pas changer.

Mise à jour

C'est l'exception à laquelle je suis confronté

AttributeError dans/ViewName/l'objet 'module' n'a pas d'attribut 'Field'

Comment puis-je faire ceci?

71
Shoaib Ijaz

Vous pouvez utiliser serializers.SerializerMethodField:

Voici le modèle Park, qui contient les champs nom et nom-remplaçant.

class Park(models.Model):
    name = models.CharField(max_length=256)
    alternate_name = models.CharField(max_length=256, blank=True)
    objects = models.GeoManager()

    class Meta:
        db_table = u'p_park'

    def __unicode__(self):
        return '%s' % self.name

Voici Serializer pour Park Model, ParkSerializer. Cela change le nom de nom-remplaçant en emplacement.

class ParkSerializer(serializers.ModelSerializer):
    location = serializers.SerializerMethodField('get_alternate_name')

    class Meta:
        model = Park
        fields = ('other_fields', 'location')

    def get_alternate_name(self, obj):
        return obj.alternate_name

De plus, vous pouvez utiliser serializers.CharField Avec l'attribut source:

class ParkSerializer(serializers.ModelSerializer):
    location = serializers.CharField(source='other_fields')

    class Meta:
        model = Park
        fields = ('other_fields', 'location')

La notation __ De Django pour parcourir les clés étrangères fonctionne également:

location = serializers.CharField(source='OtherModel__other_fields')

Le même principe s'applique si vous souhaitez modifier le type de retour sur l'API afin que vous puissiez également utiliser serializers.DecimalField(source=...) ainsi que d'autres types de champs.

Cela ne fonctionnerait cependant que pour les champs en lecture seule.

34
erthalion

Il existe une fonctionnalité très intéressante dans les champs de sérialiseur et les sérialiseurs en général, appelés "source", dans laquelle vous pouvez spécifier la source de données à partir du champ de modèle.

class ParkSerializer(serializers.ModelSerializer):
    location = serializers.SomeSerializerField(source='alternate_name')

    class Meta:
        model = Park
        fields = ('other_fields', 'location')

Où serializers.SomeSerializerField peut être serializers.CharField, comme le suggère votre modèle, mais peut également utiliser n'importe lequel des autres champs. Vous pouvez également mettre des champs relationnels et d’autres sérialiseurs à la place, ce qui fonctionnerait toujours comme un charme. c'est-à-dire même si nom_alternatif était un champ de clé étrangère vers un autre modèle.

class ParkSerializer(serializers.ModelSerializer):
    locations = AlternateNameSerializer(source='alternate_name', many=true)

    class Meta:
        model = Park
        fields = ('other_fields', 'locations')

class AlternateNameSerializer(serializers.ModelSerialzer):
    class Meta:
        model = SomeModel

Cela fonctionne également avec les types de création, de suppression et de modification de demandes. Il crée efficacement un mappage un sur un du nom de champ dans le sérialiseur et du nom de champ dans les modèles.

185
iankit

Cela fonctionnerait aussi pour les opérations d'écriture

class ParkSerializer(serializers.ModelSerializer):
    location = serializers.CharField(source='alternate_name')

    class Meta:
        model = Park
        fields = ('id', 'name', 'location')
12
vijay