You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 23:11:00