Используйте класс сериализатора внутри другого в Django - PullRequest
0 голосов
/ 02 марта 2020

Я хочу иметь сериализаторы, которые используют две модели одновременно (если это возможно)

models.py

class Club(models.Model):
    id = models.AutoField(primary_key=True)
    clubname = models.CharField(max_length=50, blank=True, null=True)
    location = models.CharField(max_length=50, blank=True, null=True)
    scores = models.IntegerField(blank=True, null=True)

serializers.py

class ShowAllClubSerializer(serializers.ModelSerializer):
    class Meta:
        model = Club
        fields 

class ShowClubPictures(serializers.ModelSerializer):
    class Meta:
        model = Clubpictures
        fields = ['picture']

views.py

@api_view(["GET", ])
@permission_classes((IsAuthenticated, ))
def show_all_clubs_view(request):
    if request.method == "GET":
        clubs = Club.objects.all()
        if clubs:

            for club in clubs:
                pictures = Clubpictures.objects.filter(clubid=club.id)
                serializer1 = ShowAllClubSerializer(club)
                serializer2 = ShowClubPictures(pictures[0])
            return Response(serializer1.data, status=status.HTTP_200_OK)
          # return Response(serializer2.data, status=status.HTTP_200_OK)
    else:
        return Response(status=status.HTTP_400_BAD_REQUEST)

Теперь у меня есть эти в сериализаторах1 и сериализаторах2 отдельно:

{
    "clubname": "Club Name",
    "location": "Somewhere",
    "scores": 5,
}

{
    "picture": "/media/images/Screenshot.png"
}

Как могу ли я взять что-то подобное в результате:

{
    "clubname": "Club Name",
    "location": "Somewhere",
    "scores": 5,
    "picture": "/media/images/Screenshot.png"
}

1 Ответ

1 голос
/ 02 марта 2020

Вы можете использовать nested serializers для достижения этого.

Ваш ClubSerializer будет выглядеть примерно так:

class ClubSerializer(serializers.ModelSerializer):
    pictures = ClubPictureSerializer(many=True)
    class Meta:
        model = Club
        fields = ('clubname', 'location', 'scores', 'pictures')

class ClubPictures(serializers.ModelSerializer):
    class Meta:
        model = Clubpictures
        fields = ['picture']

при условии, что у вас есть ForeignKey от ClubPicture до Club с related_name из pictures.

Кроме того, по вашему мнению, вам не нужно l oop - Club.objects.all() и сериализовать каждый объект индивидуально - ModelSerializer / Serializer принять many=True параметры, которые уже обрабатывают несколько объектов.

...