related primarykeyrelatedfield one many framework foreign create django rest hyperlink resources django-rest-framework

primarykeyrelatedfield - nested relationships django rest framework



Marco Django REST: cuándo crear un recurso hipervinculado y cuándo recurso anidado? ¿CÓMO PUBLICAR un recurso anidado? (1)

Estoy construyendo una API web REST usando el Framework REST de Django. Las cosas van muy bien, pero he tropezado con un problema con los recursos anidados. Al principio, todas las relaciones en la API REST estaban hipervinculadas. Una publicación, por ejemplo, se veía así:

{ "path": "http://api.myproject.com/posts/1.json", "id": 1, "author": "http://api.myproject.com/users/broak.json", "image": "/images/posts/cxyUzlPo.jpg", "header": "Who am I?", "footer": "I am a champion!", "date": "2014-11-09 15:16", "likes": "http://api.myproject.com/posts/1/likes.json", "comments": "http://api.myproject.com/posts/1/comments.json", "likes_count": 0, "comments_count": 0 }

La relación entre la publicación y el autor (usuario) está hipervinculada. Cuando desee crear una nueva publicación, debe especificar un hipervínculo correcto para un usuario específico: esto funciona bien.

Al llamar a una lista de publicaciones, las cosas se vuelven ineficientes, ya que debe realizar una llamada API adicional para cada autor por cada publicación. Lo resolví utilizando recursos NESTED en lugar de recursos HIPERVÍNCULOS, por lo que cada publicación ahora contiene toda la información sobre el autor.

{ "path": "http://api.myproject.com/posts/1.json", "id": 1, "author": { "email": "[email protected]" "username": "broak", "first_name: "John", "last_name": "Broak", "is_staff": False, "is_active": True, "last_login": "02-26-2016" }, "image": "/images/posts/cxyUzlPo.jpg", "header": "Who am I?", "footer": "I am a champion!", "date": "2014-11-09 15:16", "likes": "http://api.myproject.com/posts/1/likes.json", "comments": "http://api.myproject.com/posts/1/comments.json", "likes_count": 0, "comments_count": 0 }

Mi primera pregunta es: ¿tiene una guía, si debo crear una estructura de datos anidada o un punto final separado con un hipervínculo a ella?

Mi segunda pregunta es: cuando uso el autor como recurso anidado y deseo crear una nueva publicación, no deseo especificar toda la información sobre el autor (nombre de usuario, correo electrónico, ...). ¿Hay alguna manera de simplemente usar un enlace a un usuario para la operación CREAR / ACTUALIZAR? ¿O modificar algo para que la identificación del usuario sea suficiente para completar este campo?


Si entendí su pregunta correctamente, quiere tener un autor ampliado mientras está recuperando los datos y solo desea enviar ID o URL en caso de actualización y creación.

1# No se trata de ninguna directriz y depende totalmente de su requisito de cómo se utilizará su api .

2# Por lo tanto, necesita extender su UserSerializer y anular to_internal_value . El código de muestra puede parecerse

class MyCustomSerializer(UserSerializer): def to_internal_value(self, data): # data must be valid user-detail url return serializers.HyperLinkedRelatedField(queryset=User.objects.all(), view_name=''user-detail'').to_internal_value(data)

Tenga en cuenta que debe tener un Endpoint para detalles de usuario que pueda trabajar con HyperLinkedRelatedField.

Entonces, si desea poder enviar ID entonces el código de muestra podría verse como

class MyCustomSerializer(UserSerializer): # data must be valid user id def to_internal_value(self, data): return serializers.PrimaryKeyRelatedField(queryset=User.objects.all()).to_internal_value(data)

Sin embargo, me gustaría mantener la coherencia al enviar el campo ForeignKey en POST/PUT/PATCH . (Siempre sea URL o ID).

luego úsala en tu código como

class PostSerializer(serializers.HyperlinkedModelSerializer): author = MyCustomSerializer() class Meta: model = Post

Consulte la documentación sobre los serializadores anónimos Escribir en POST en un recurso anidado.