Как получить имена 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__"