python - 如何从外键 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”}
如您所见,响应不包括我需要的类别名称。你能帮我解决这个问题吗?谢谢
解决方案
您可以更新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(写入)来创建产品的情况,同时还希望将其作为另一个发送表示。
推荐阅读
- python-3.x - 如何在 gui tkinter 中使用按钮运行 pyton 脚本
- python - 替换列表中的反冲 (\)
- php - 抛出新异常 laravel 在 expectException PHP 单元中不起作用
- salesforce - 现场服务闪电移动 Visualforce 登录
- python-3.x - Python 正则表达式适用于 MacOS 但不适用于 Ubuntu
- .net - Data.DataTable().Compute 不评估 vb.net 中的大数
- c - 如何在 MPI 中发送每个处理器的最后一个元素数组
- javascript - 仅从 html 表单选择发送数据是否处于活动状态
- javascript - Socket io 在我运行服务器时建立了 2 个连接
- python - PYQT 5 使主窗口的类对象正确?