【问题标题】:How to get foreignkey field name instead of id in django rest framework如何在 django rest 框架中获取外键字段名称而不是 id
【发布时间】:2019-02-28 16:09:51
【问题描述】:

这是我的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

这是我的 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__'

这是我的意见.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

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

[
    {
        "id": 1,
        "name": "soubhagya",
        "company_name": 1
    },
    {
        "id": 2,
        "name": "nihar",
        "company_name": 2
    }
]

但我期待输出--

像这样:

[
    {
        "id": 1,
        "name": "soubhagya",
        "company_name": "google"
    },
    {
        "id": 2,
        "name": "nihar",
        "company_name": "facebook"
    }
]

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

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    由于您在 Company 模型中定义了 __str__() 方法,因此您可以将 StringRelatedField() 用作

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


    更新
    覆盖 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

    【讨论】:

    • 我也想发帖
    • TypeError at /users/ super() 需要至少 1 个参数(给定 0)
    • 使用super(UserSerializer, self).to_representation(instance) 而不是super().to_representation(instance)
    • 是的。使用StringRelatedField() 很简单。但是,cmets 说他还需要进行写入和更新 操作
    【解决方案2】:

    简单的解决方案是使用source

    class UserSerializer(serializers.ModelSerializer):
        company_name = serializers.CharField(source='company_name.name')
    

    【讨论】:

    • 这是最简单的,可以添加公司id作为字段,以便在js页面中用于表单(代表“公司”)。
    【解决方案3】:
    class UserSerializer(serializers.ModelSerializer):
        company_name = serializers.SerializerMethodField(source='get_company_name')
        class Meta:
            model = User
            fields = '__all__'
        def get_company_name(self, obj):
            return obj.company_name.name
    

    【讨论】:

    • 我也想发帖
    • 然后改成 CharField
    • 现在我的公司输入字段不见了。我还需要发布数据
    • @Exprator 为您的解决方案源不需要。
    【解决方案4】:

    使用深度。

    class PhoneSerializer(serializers.ModelSerializer):
        class Meta:
            model = Phone
            depth = 1
            fields = '__all__'
    

    【讨论】:

      【解决方案5】:
      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
      

      【讨论】:

        【解决方案6】:

        这里是documentation

        这对我有用:

        company_name = serializers.SlugRelatedField(read_only=True, slug_field='name')
        

        【讨论】:

          猜你喜欢
          • 2023-03-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-04
          • 2015-05-08
          • 2020-08-19
          • 2021-03-05
          • 2020-11-12
          相关资源
          最近更新 更多