首页 > 解决方案 > 如何从外键 id 中获取值?

问题描述

我最近开始学习 django,所以我什至不知道如何问这个问题。我想构建一个 api,我正在使用 django rest 框架。现在我有两个主要模型产品和类别。

class Category(models.Model):
    id = models.CharField(max_length=100, primary_key=True)
    name = models.CharField(max_length=100)


class Product(models.Model):
    id = models.CharField(max_length=100, primary_key=True)
    title = models.CharField(max_length=100)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    price = models.FloatField(default=0.0)

我有一些功能

@api_view(['GET'])
def productList(request):
    products = Product.objects.all()
    serializer = ProductSerializer(products, many=True)
    return Response(serializer.data)

@api_view(['POST'])
def addProduct(request):
    serializer = ProductSerializer(data=request.data)

    if serializer.is_valid():
        serializer.save()

    return Response(serializer.data)

所有这些似乎都工作正常,我从一个看起来像这样的 api 得到响应:

{id:“1”,标题:“香蕉”,价格:3,类别:“1”}

如您所见,响应不包括我需要的类别名称。你能帮我解决这个问题吗?谢谢

标签: pythondjangodjango-rest-frameworkforeign-keys

解决方案


您可以更新to_representation序列化程序的方法,以包含类别名称或使用嵌套表示。如果您想返回类别的名称:

class ProductSerializer(serializers.ModelSerializer):

    def to_representation(self, instance):
        data = super().to_representation(instance)
        data['category'] = instance.category.name
        return data

如果您想返回该类别的嵌套表示,您可以执行以下操作:

class CategorySerializer(serializers.ModelSerializer):
    
    class Meta:
        model = Category
        fields = ('id', 'name',)


class ProductSerializer(serializers.ModelSerializer):

    def to_representation(self, instance):
        data = super().to_representation(instance)
        data['category'] = CategorySerializer(instance.category).data
        return data

请记住,这是针对您使用相同的序列化程序来创建和列出产品的情况,以及您通过接收类别的 id(写入)来创建产品的情况,同时还希望将其作为另一个发送表示。


推荐阅读