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

在pytest-django测试中如何为响应添加organizer字段以通过测试

如何让LeadSerializer响应返回organizer字段?

我是测试新手,折腾了一天还没解决这个问题:系统里有organizer和agent两类用户,只有organizer能创建Lead,创建时会把认证用户关联到organizer字段,但当前的LeadSerializer没包含这个字段,导致测试用例无法通过,想让API响应返回organizer字段。

现有代码

LeadSerializer代码

class LeadSerializer(serializers.ModelSerializer):

    def create(self, validated_data):
        user = self.context['user']

        return Lead.objects.create(organizer=user.organizeruser, **validated_data)

    class Meta:
        model = Lead
        fields = ['id', 'first_name', 'last_name', 'age', 'agent', 'category', 'description', 'date_added',
                  'phone_number', 'email', 'converted_date'
                  ]

测试代码

def test_if_lead_exist_return_200(self, api_client, leads_factory, user_factory):
    user = user_factory.create(is_organizer=True)
    api_client.force_authenticate(user=User(is_staff=True))

    lead = leads_factory.create()

    serializer = LeadSerializer(context={'request': user})
    print(serializer)
    # here I can see the user

    response = api_client.get(f'/api/leads/{lead.id}/', )

    assert response.status_code == status.HTTP_200_OK

    assert response.data == {
        'id': lead.id,
        'first_name': lead.first_name,
        'last_name': lead.last_name,
        'age': lead.age,
        'organizer': lead.organizer.id,
        'agent': lead.agent.id,
        'category': lead.category.id,
        'description': lead.description,
        'date_added': lead.date_added,
        'phone_number': lead.phone_number,
        'email': lead.email,
        'converted_date': lead.converted_date,

    }

解决方案

方法1:直接在序列化器字段列表中添加organizer

这是最直接的方式,因为关联字段默认序列化后会返回对应对象的ID,刚好匹配测试用例的预期:

class LeadSerializer(serializers.ModelSerializer):

    def create(self, validated_data):
        user = self.context['user']
        return Lead.objects.create(organizer=user.organizeruser, **validated_data)

    class Meta:
        model = Lead
        fields = ['id', 'first_name', 'last_name', 'age', 'agent', 'category', 'description', 'date_added',
                  'phone_number', 'email', 'converted_date', 'organizer'  # 新增organizer字段
                  ]

方法2:自定义organizer字段(按需扩展)

如果后续需要返回organizer的更多信息(比如用户名),可以显式定义字段:

class LeadSerializer(serializers.ModelSerializer):
    # 仅返回ID(和默认行为一致)
    organizer = serializers.PrimaryKeyRelatedField(read_only=True)
    # 若要返回用户名,可替换为:
    # organizer = serializers.CharField(source='organizer.username', read_only=True)

    def create(self, validated_data):
        user = self.context['user']
        return Lead.objects.create(organizer=user.organizeruser, **validated_data)

    class Meta:
        model = Lead
        fields = ['id', 'first_name', 'last_name', 'age', 'agent', 'category', 'description', 'date_added',
                  'phone_number', 'email', 'converted_date', 'organizer'
                  ]

测试用例补充修正

另外注意测试代码里的认证逻辑有误,应该用创建好的user对象,而不是新建无关的User实例:

api_client.force_authenticate(user=user)  # 替换原有的User(is_staff=True)

内容的提问来源于stack exchange,提问作者Ryan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:15:06