Как получить имена foreignkey вместо sql reference number django view

Я пытаюсь создать простой rest api на django. У меня есть таблица транзакций, счетов и акций. Каждая транзакция указывает на 1 счет и 1 акцию (в отдельных таблицах с использованием внешних ключей). Я пытаюсь сделать так, чтобы мой api получал тикер акции для каждой транзакции, а не номер sql ссылки. Кто-нибудь знает, как заставить простые представления возвращать значения вместо ключей таблиц?

сериализаторы, которые я использую:

class TransactionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Transaction
        fields = "__all__"

class StockSerializer(serializers.ModelSerializer):
    class Meta:
        model = Stock
        fields = "__all__"


class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        fields = "__all__"

модели для сделок и акций:

class Stock(models.Model):
    ticker = models.CharField(max_length=10, unique=True)
    name = models.CharField(max_length=200)
    price = models.FloatField()

    def __str__(self):
        return self.ticker

class Transaction(models.Model):
    account = models.ForeignKey(Account, on_delete=models.CASCADE)
    stock = models.ForeignKey(Stock, on_delete=models.CASCADE)
    amount = models.IntegerField()
    price = models.FloatField()
    type = models.CharField(max_length=10)
    date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.account

я опускаю модель учетной записи/пользователя, но она беспорядочна и наполовину привязана к базовой модели пользователя django

представление, которое я использую, является базовым APIVIEW:

class TransactionView(APIView):
    permission_classes = (IsAuthenticated,)
    authentication_classes = (JWTAuthentication,)

    def get(self, request, *args, **kwargs):
        account = Account.objects.get(email=request.user.email)
        transactions = Transaction.objects.filter(account=account)
        serializer = TransactionSerializer(transactions, many=True)
        return Response(serializer.data)

и вывод, который я получаю от postman:

[
    {
        "id": 1,
        "amount": 1,
        "price": 146.1,
        "type": "buy",
        "date": "2022-10-05T04:12:10.414961Z",
        "account": 1,
        "stock": 1
    },
    {
        "id": 2,
        "amount": 1,
        "price": 146.1,
        "type": "buy",
        "date": "2022-10-05T04:17:57.807945Z",
        "account": 1,
        "stock": 1
    }
]

также url, который я использую для конечной точки:

path("transactions/", views.TransactionView.as_view(), name="transactions"),

Прошу прощения за повторение, но основная проблема в том, что когда я вызываю конечную точку api, я получаю 1 для акции и 1 для счета вместо тикера акции и имени счета, и я не знаю, как заставить представление вернуть всю информацию без вызова второй конечной точки, которая возвращает акции, и третьей конечной точки для возврата информации о счете. У меня сложилось впечатление, что функция модели __str__ будет возвращать информацию об объекте, но здесь этого не происходит

Вы должны определить поле "запас" и поле "счет" в сериализаторе транзакции. (Присвоив соответствующий сериализатор в качестве значения).
Это позволит вам указать DRF, как сериализовать связанную модель.

class TransactionSerializer(serializers.ModelSerializer):
    stock = StockSerializer()
    account = AccountSerializer()

    class Meta:
       model = Transaction
       fields = "__all__"
Вернуться на верх