Konvertiert Modellobjekte in JSON!
Na dann Diesmal beim Abrufen des Book-Objekts Holen Sie sich den Autor, auf den ForeignKey verweist, einschließlich des Objekts !!!!!!!!!!!!
Dies ist ein Beispielmodell! Das "Buch" -Modell bezieht sich auf das "Autoren" -Modell!
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)
Erstellen Sie eine get-API mit dem generischen ListAPIView!
Da auch das "Autor" -Modell erworben wird, wird das Abfrageset
Geben Sie den Autor in select_related
an.
Es ist möglich, es zu bekommen, weil es "all ()" ist, aber "select_related. (" Author ")"
Durch vorherige Angabe können Sie die Menge an SQL reduzieren, die ausgegeben werden soll !!
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, um eine Liste der Bücher zu erhalten"""
queryset = Book.objects.select_related('author')
serializer_class = BookSerializer
filter_backends = [filters.DjangoFilterBackend]
filterset_fields = '__all__'
Sie können einen Ziel-Serializer im Feld "BookSerializer" definieren! Jetzt können Sie auch das verwandte Modell bekommen !!!
Eine Sache, die hier zu beachten ist, ist jedoch der Serializer, der die Referenzquelle ist. Bei der Definition bezieht sich der Feldname auf Lookup. Machen Sie also keinen Fehler Bitte !!
serializer.py
class AuthorSerializer(serializers.ModelSerializer):
class Meta:
model = Author
fields = '__all__'
class BookSerializer(serializers.ModelSerializer):
author = AuthorSerializer()
class Meta:
model = Book
fields = '__all__'
Im Ausgabeergebnis werden auch die im Beispielmodell ausgelassenen Daten ausgegeben !! Bitte überspringen Sie es!
Zuvor habe ich auch das Buchmodell und das referenzierende "Autoren" -Modell erhalten. Im Gegenteil, ich möchte "Buch" vom "Autor" bekommen !!. Die Methode ist einfach!
Ich möchte es mit ListAPIView bekommen. Dieses Mal können Sie einfach "all ()" ohne "select_related" verwenden.
views.py
class ListAuthor(generics.ListAPIView):
"""Autor holen"""
queryset = Author.objects.all()
serializer_class = AuthorBookSerializer
filter_backends = [filters.DjangoFilterBackend]
filterset_fields = '__all__'
Es ist book_set
, um das referenzierte Modell zu erhalten!
Wenn Sie jetzt die API anfordern, können Sie den Autor und das Buch abrufen.
Wenn Sie zu diesem Zeitpunkt "author = AuthorSerializer ()" in "BookSerializer" belassen
Beachten Sie, dass Sie den "Autor" erneut erhalten, wenn Sie das "Buch" erhalten.
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__'
Das ist es!