tabla queryset plantilla modelos girls girl formulario form example dinamica data django django-rest-framework

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?