J'essaye de changer le nom de champ de modèle dans DRF Serializer comme alias dans SQL. J'ai essayé différentes méthodes mais je n'y parviens pas.
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 également essayé d'ajouter un alias dans Django Queryset mais je ne peux pas changer.
Actualisé
C'est l'exception à laquelle je suis confronté
AttributeError at / ViewName / l'objet 'module' n'a pas d'attribut 'Field'
Comment puis-je faire ceci?
django
django-rest-framework
Shoaib Ijaz
la source
la source
serializers.SerializerMethodField
approche? Je veux dire ceci:serializers.SerializerMethodField('get_location')
etdef get_location(self, obj): ...
serializers.py
?Réponses:
Vous pouvez utiliser
serializers.SerializerMethodField
:Voici le modèle Park, qui a des champs de nom et de nom alternatif.
Voici Serializer pour Park Model, ParkSerializer. Cela change le nom du nom alternatif en location.
De plus, vous pouvez utiliser
serializers.CharField
avec l'source
attribut:La
__
notation de Django pour traverser la clé étrangère 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, vous pouvez donc le faire
serializers.DecimalField(source=...)
ainsi que d'autres types de champs.Cela ne fonctionnerait cependant que pour les champs en lecture seule.
la source
source
plutôt le kwarg comme décrit ci-dessous.Il existe une fonctionnalité très intéressante dans les champs de sérialiseur et les sérialiseurs en général appelée «source» où vous pouvez spécifier la source des données à partir du champ de modèle.
Où serializers.SomeSerializerField peut être serializers.CharField comme le suggère votre modèle, mais peut également être utilisé par l'un des autres champs. Vous pouvez également mettre des champs relationnels et d'autres sérialiseurs à la place et cela fonctionnerait toujours comme un charme. c'est-à-dire même si alter_name était un champ de clé étrangère vers un autre modèle.
Cela fonctionne également avec les demandes de type création, suppression et modification. Il crée effectivement un mappage un sur un du nom de champ dans le sérialiseur et du nom de champ dans les modèles.
la source
source
une approche plus générale. Mais vous pouvez voir quelques tentatives pour l'utiliser dans la question, donc si vous souhaitez répondre de cette façon, vous devez également expliquer pourquoi le code d'origine ne fonctionne pas, n'est-ce pas?locations = serializers.PrimaryKeyRelatedField(source='alternate_name', queryset=AlternateName.objects.all())
. Apparemment,RelatedField
peut également être utilisé.Cela fonctionnerait également pour les opérations d'écriture
la source