如何在 django rest 框架中获取 id 的外键字段名称

Kir*_*nel 6 python django django-rest-framework

这是我的models.py

from __future__ import unicode_literals
from django.db import models

class User(models.Model):
    name = models.CharField(max_length=200)
    company_name = models.ForeignKey('Company',on_delete=models.CASCADE,related_name='user')

    def __str__(self):
        return self.name

class Company(models.Model):
    name = models.CharField(max_length=200)
    phone_number = models.IntegerField(null=True,blank=True)

    def __str__(self):
        return self.name

class Catalog(models.Model):
    name = models.CharField(max_length=200)
    no_of_pcs = models.IntegerField(null=True,blank=True)
    per_piece_price = models.DecimalField(null=True,blank=True,max_digits=10,decimal_places=2)
    company_name = models.ForeignKey(Company,on_delete=models.CASCADE,related_name='catalog')

    def __str__(self):
        return self.name
Run Code Online (Sandbox Code Playgroud)

这是我的 serializers.py

from rest_framework import serializers
from .models import *
from django.db.models import Sum,Count

class UserSerializer(serializers.ModelSerializer):
    # name = serializers.StringRelatedField()
    # company_name = serializers.CharField()
    class Meta:
        model = User
        fields = '__all__'
Run Code Online (Sandbox Code Playgroud)

这是我的 views.py

from __future__ import unicode_literals
from django.http import HttpResponse
from .models import *
import json
from django.http import JsonResponse, HttpResponse
from .serializers import *
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework import viewsets

class UserView(viewsets.ModelViewSet):
    queryset =  User.objects.all()
    serializer_class = UserSerializer
Run Code Online (Sandbox Code Playgroud)

我得到这样的 api.. 在这里我得到 id 而不是 company_name。

[
    {
        "id": 1,
        "name": "soubhagya",
        "company_name": 1
    },
    {
        "id": 2,
        "name": "nihar",
        "company_name": 2
    }
]
Run Code Online (Sandbox Code Playgroud)

但我期待输出--

像这样:

[
    {
        "id": 1,
        "name": "soubhagya",
        "company_name": "google"
    },
    {
        "id": 2,
        "name": "nihar",
        "company_name": "facebook"
    }
]
Run Code Online (Sandbox Code Playgroud)

我期待我的 api 像这样。与公司名称。我想在休息框架中发布来自同一个 api 的数据,谢谢,

JPG*_*JPG 7

由于您已__str__()Company模型中定义了方法,因此您可以使用StringRelatedField()as

class UserSerializer(serializers.ModelSerializer):
    company_name = serializers.StringRelatedField()
    class Meta:
        model = User
        fields = '__all__'
Run Code Online (Sandbox Code Playgroud)


UPDATE
覆盖to_representation方法

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'

    def to_representation(self, instance):
        rep = super(UserSerializer, self).to_representation(instance)
        rep['company_name'] = instance.company_name.name
        return rep
Run Code Online (Sandbox Code Playgroud)


Bea*_*own 6

简单的解决方案是使用

class UserSerializer(serializers.ModelSerializer):
    company_name = serializers.CharField(source='company_name.name')
Run Code Online (Sandbox Code Playgroud)