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