Convertit les objets de modèle en JSON!
Eh bien Cette fois, lors de l'obtention de l'objet Livre Obtenez l'auteur référencé par ForeignKey, y compris l'objet !!!!!!!!!!!!
Ceci est un exemple de modèle!
Le modèle Book
fait référence au modèle ʻAuthor`!
models.py
class AbstractModel(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
is_deleted = models.CharField(max_length=1, default='0')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
class Author(AbstractModel):
first_name = models.CharField(max_length=128)
last_name = models.CharField(max_length=128)
class Book(AbstractModel):
title = models.CharField(max_length=128)]
sub_title = models.CharField(max_length=128)]
price = models.DecimalField(max_digits=8, decimal_places=2, blank=True, null=True)
author = models.ForeignKey(Author, on_delete=models.PROTECT, blank=True, null=True)
Créez une API get en utilisant les génériques ListAPIView!
Le modèle ʻAuthorest également acquis, donc queryset Spécifiez l'auteur dans
select_related. Il est possible de l'obtenir car c'est ʻall ()
, maisselect_related. ('Author')
En spécifiant à l'avance, vous pouvez réduire la quantité de SQL à émettre !!
views.py
from django_filters import rest_framework as filters
from rest_framework import generics
from book.models import Book, Author
from book.serializers import BookSerializer
class ListBook(generics.ListAPIView):
"""API pour obtenir une liste de livres"""
queryset = Book.objects.select_related('author')
serializer_class = BookSerializer
filter_backends = [filters.DjangoFilterBackend]
filterset_fields = '__all__'
Vous pouvez définir un sérialiseur de destination dans le champ BookSerializer
!
Maintenant, vous pouvez également obtenir le modèle associé !!!
Cependant, une chose à noter ici est le sérialiseur qui est la source de référence. Lors de la définition, le nom du champ est lié à lookup donc ne faites pas d'erreur S'il vous plaît !!
serializer.py
class AuthorSerializer(serializers.ModelSerializer):
class Meta:
model = Author
fields = '__all__'
class BookSerializer(serializers.ModelSerializer):
author = AuthorSerializer()
class Meta:
model = Book
fields = '__all__'
Dans le résultat de sortie, les données omises dans l'exemple de modèle sont également sorties !! Veuillez le sauter !!
Auparavant, j'avais également le modèle Book et le modèle référent ʻAuthor, Au contraire, je voudrais obtenir
Book de ʻAuthor
!!.
la méthode est simple!
Je voudrais l'obtenir en utilisant ListAPIView.
Cette fois, il n'y a aucun problème avec ʻall () car il est sans
select_related`.
views.py
class ListAuthor(generics.ListAPIView):
"""Obtenir l'auteur"""
queryset = Author.objects.all()
serializer_class = AuthorBookSerializer
filter_backends = [filters.DjangoFilterBackend]
filterset_fields = '__all__'
C'est book_set
pour obtenir le modèle référencé!
Maintenant, lorsque vous demandez l'API, vous pouvez obtenir l'auteur et le livre.
À ce stade, si vous laissez ʻauthor = AuthorSerializer () dans
BookSerializer`
Notez que lorsque vous obtenez le «livre», vous récupérez à nouveau «l'auteur».
serializers.py
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = '__all__'
class AuthorBookSerializer(serializers.ModelSerializer):
book_set = BookSerializer(many=True)
class Meta:
model = Author
fields = '__all__'
C'est tout!
Recommended Posts