在Django中获取User用户名并添加至API响应的正确方法
问题
开发练习项目时,需展示售卖指定产品的所有用户名称。已在ProductSeller模型中将user字段设为User的外键,但API响应仅返回用户ID,无法获取用户名,如何调整以返回如下期望结果?
现有模型代码
class ProductSeller(models.Model): product_id=models.ForeignKey(Product,on_delete=models.CASCADE,default = None) user=models.ForeignKey(User,on_delete=models.CASCADE) condition = models.CharField(max_length=100, choices=condition_choices) asked_price=models.IntegerField() image=models.ImageField(null=True,blank=True)
现有视图代码
@api_view(['GET']) def getSellersById(request,pk): sellers=ProductSeller.objects.filter(product_id=pk) seralizer=SellersSerializer(sellers,many=True) return Response(seralizer.data)
当前响应
{ "id": 2, "condition": "Almost new", "asked_price": 50, "image": "image.jpg", "product_id": 8, "user": 1 }
期望响应
{ "id": 2, "condition": "Almost new", "asked_price": 50, "image": "image.jpg", "product_id": 8, "user": 1, "seller_name":"John" }
解决方案
你可以通过修改SellersSerializer来实现需求,以下是几种常用方法:
方法1:使用SerializerMethodField自定义字段
通过自定义方法获取关联用户的用户名,灵活性高,适合需要额外处理逻辑的场景:
from rest_framework import serializers from .models import ProductSeller class SellersSerializer(serializers.ModelSerializer): seller_name = serializers.SerializerMethodField() class Meta: model = ProductSeller fields = ['id', 'condition', 'asked_price', 'image', 'product_id', 'user', 'seller_name'] def get_seller_name(self, obj): # 假设User模型的用户名字段为`username`,根据实际字段名调整 return obj.user.username
方法2:使用source参数直接映射字段
如果不需要额外逻辑,直接通过source关联用户名字段,代码更简洁:
class SellersSerializer(serializers.ModelSerializer): seller_name = serializers.CharField(source='user.username', read_only=True) class Meta: model = ProductSeller fields = ['id', 'condition', 'asked_price', 'image', 'product_id', 'user', 'seller_name']
方法3:嵌套用户序列化器(适用于需要更多用户信息的场景)
如果后续需要返回更多用户相关字段,可以定义嵌套的用户序列化器:
from rest_framework import serializers from django.contrib.auth.models import User from .models import ProductSeller class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ['id', 'username'] # 可添加其他需要的用户字段 class SellersSerializer(serializers.ModelSerializer): user = UserSerializer() class Meta: model = ProductSeller fields = ['id', 'condition', 'asked_price', 'image', 'product_id', 'user']
这种方式会将user字段转为包含用户ID和用户名的对象,若想保留原userID字段同时新增用户名,可单独定义user_id字段:
class SellersSerializer(serializers.ModelSerializer): user_id = serializers.IntegerField(source='user.id') seller_name = serializers.CharField(source='user.username') class Meta: model = ProductSeller fields = ['id', 'condition', 'asked_price', 'image', 'product_id', 'user_id', 'seller_name']
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

