queryset - render data django
Cómo usar el serializador para crear un nuevo objeto con una clave externa (1)
supongamos que este modelo:
class Tweek(models.Model):
content = models.CharField(max_length=140)
date = models.DateTimeField(auto_now_add=True)
author = models.ForeignKey(User, related_name=''author'')
class Meta:
ordering = [''-date'']
def __unicode__(self):
return self.content
Everthing funciona bien, ahora trato de atar un resto api uppon. He instalado el marco de trabajo django rest y puedo recuperar tweeks pero no puedo crear nuevos.
Tengo este serializador para el modelo Tweek:
class TweekSerializer(serializers.ModelSerializer):
author = UserSerializer()
class Meta:
model = Tweek
fields = (''content'', ''date'', ''author'')
def create(self, validated_data):
author_data = validated_data.pop(''author'')
author = User.objects.get(username=author_data)
return Tweek.objects.create(author=author, **validated_data)
y el serializador de usuario tiene un aspecto similar a:
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = (''username'', ''first_name'', ''last_name'')
pero la publicación regresa
{
"author": {
"username": [
"This field must be unique."
]
}
}
Seguí el documento, pero estoy perdido con este caso :( ¿Alguna idea?
El problema aquí es que cualquier campo con el unique=True
conjunto unique=True
, como el campo de username
en el modelo de User
Django, automáticamente tendrá el UniqueValidator
agregado al campo del serializador. Este validador es lo que está activando el mensaje que está viendo, y puede eliminar la validación estableciendo validators
en []
(una lista vacía) al inicializar el campo.
El otro problema con el que se encontrará es que está tratando de crear un objeto con una clave externa, pero está devolviendo el objeto serializado completo en su respuesta. Este problema se soluciona más fácilmente mediante el uso de un segundo campo para configurar el ID, que es solo de escritura, y utilizando el campo del serializador original para la representación anidada y haciendo que sea de solo lectura.
Puede encontrar más información en la siguiente pregunta sobre desbordamiento de pila: DRF: ¿asignación de clave externa simple con serializadores anidados?