Estou tentando alterar o nome do campo Model em DRF Serializer como um alias em SQL. Tentei métodos diferentes, mas não consegui.
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')
Também tentei adicionar alias no Django Queryset, mas não consigo alterar.
Atualizada
Esta é a exceção que estou enfrentando
AttributeError em / ViewName / objeto 'módulo' não tem atributo 'Campo'
Como posso fazer isso?
django
django-rest-framework
Shoaib Ijaz
fonte
fonte
serializers.SerializerMethodField
abordagem? Quero dizer:serializers.SerializerMethodField('get_location')
edef get_location(self, obj): ...
serializers.py
?Respostas:
Você pode usar
serializers.SerializerMethodField
:Aqui está o modelo Park, que possui os campos name e alternate_name.
Aqui está o Serializer for Park Model, ParkSerializer. Isso muda o nome de alternate_name para local.
Além disso, você pode usar
serializers.CharField
com osource
atributo:A
__
notação do Django para atravessar a chave estrangeira também funciona:location = serializers.CharField(source='OtherModel__other_fields')
O mesmo princípio se aplica se você deseja alterar o tipo de retorno na API, portanto, você pode fazer
serializers.DecimalField(source=...)
e outros tipos de campo também.No entanto, isso funcionaria apenas para campos somente leitura.
fonte
source
kwarg como descrito abaixo.Há um recurso muito bom nos campos do serializador e serializadores em geral, chamado 'source', onde você pode especificar a fonte dos dados do campo do modelo.
Onde serializers.SomeSerializerField pode ser serializers.CharField como seu modelo sugere, mas também pode por qualquer um dos outros campos. Além disso, você pode colocar campos relacionais e outros serializadores, e isso ainda funcionaria perfeitamente. ou seja, mesmo se alternate_name for um campo de chave estrangeira para outro modelo.
Isso funciona com a criação, exclusão e modificação do tipo de solicitações também. Ele cria efetivamente um mapeamento de nome de campo no serializador e nome de campo em modelos.
fonte
source
é uma abordagem mais geral. Mas você pode ver poucas tentativas de usá-lo na pergunta, então, se quiser responder dessa forma, você também deve deixar claro por que o código original não está funcionando, não está?locations = serializers.PrimaryKeyRelatedField(source='alternate_name', queryset=AlternateName.objects.all())
. Aparentemente, tambémRelatedField
pode ser usado.Isso também funcionaria para operações de gravação
fonte