Как сделать так, чтобы вместо id отображалось имя контейнера?

Я пытаюсь понять, как отобразить имя ForeignKey в представлении. Я думал использовать метод map, получить объект по ID и получить имя по ID, но, похоже, это не работает. Возможно, я делаю это неправильно, но я не совсем уверен.

JSON-ответ

[
    {
        "id": 3,
        "name": "Coke",
        "description": "Cocaine Drink",
        "container": 3
    },
    {
        "id": 4,
        "name": "Another One",
        "description": "Dj Khaled Drink",
        "container": 3
    },
    {
        "id": 5,
        "name": "Testy",
        "description": "Westy",
        "container": 4
    }
]

Вид

class ListDrinks(APIView):

    authentication_classes = []
    permission_classes = []
    
    def get(self, request, format=None):
        drinks = Drink.objects.all()
        serializer = DrinkSerializer(map(DrinksId, drinks), many=True)
        return Response(serializer.data)

    def post(self, request, format=None):
        serializer = DrinkSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Модели

class Container(models.Model):
    name = models.CharField(max_length=200)

    def __str__(self):
        return self.name


class Drink(models.Model):
    name = models.CharField(max_length=200)
    description = models.CharField(max_length=500)
    container = models.ForeignKey(
        Container, on_delete=models.CASCADE, null=True)

    def __str__(self):
        return self.name

Сериализаторы


class DrinkSerializer(serializers.ModelSerializer):
    class Meta:
        model = Drink
        fields = ['id', 'name', 'description', 'container']


class ContainerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Container
        fields = ['id', 'name']

Сначала вы можете использовать ListCreateAPIView для вашего представления, проверьте его позже.

Для вашего вопроса проверьте это и обновите DrinkSerializer до этого

class DrinkSerializer(serializers.ModelSerializer):
    container = serializers.CharField(source="container.name", read_only=True)
    class Meta:
        model = Drink
        fields = ['id', 'name', 'description', 'container']

А вы можете сделать вот так, я думаю, это лучше.

    ...
    def get(self, request, format=None):
        serializer = DrinkSerializer(Drink.objects.all(), many=True)
        ...
Вернуться на верх