【问题标题】:Got AttributeError when attempting to get a value for field `phone_number` on serializer尝试在序列化程序上获取字段“phone_number”的值时出现 AttributeError
【发布时间】:2020-12-18 07:34:37
【问题描述】:

AttributeError:尝试在序列化程序 ListBusCompanyStaffSerializer 上获取字段 phone_number 的值时出现 AttributeError。 基本上我有两个模型 UserBusCompanyStaffUser 包含 phone_number 字段 BusCompanyStaff 包含以下模型字段

class BusCompanyStaff(BaseModel):
    user = models.OneToOneField(
        BusCompanyUser,
        on_delete=models.CASCADE
    )
    position = models.ForeignKey(
        StaffPosition,
        on_delete=models.SET_NULL,
        null=True,
        related_name='position'
    )
    created_by = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        related_name='created_by'
    )
    staff_of = models.ForeignKey(
        BusCompany,
        on_delete=models.CASCADE
    )

我基本上想列出来自 BusCompany 的特定 BusCompanyStaff,所以这是我迄今为止尝试过的序列化程序

class ListBusCompanyStaffSerializer(serializers.ModelSerializer):
    position = serializers.CharField()

    class Meta:
        model = BusCompanyStaff
        fields = (
            'id',
            'phone_number',
            'position',
            'email',
        )

肯定有错误,因为 BusCompanyStaff 不包含 phone_number 字段,但要求输入User 电话号码和电子邮件 这是我在 views.py 和 usecases.py 中的其余代码

#usecases.py

class ListBusCompanyStaffUseCase(BaseUseCase):
    def __init__(self, bus_company: BusCompany):
        self._bus_company = bus_company
    def execute(self):
        self._factory()
        return self._bus_company_staffs

    def _factory(self):
        self._bus_company_staffs = BusCompanyStaff.objects.filter(staff_of=self._bus_company)

#views.py

class ListBusCompanyStaffView(generics.ListAPIView):
    serializer_class = bus_company_user_serializers.ListBusCompanyStaffSerializer

    def get_bus_company(self):
        return GetBusCompanyUseCase(
            bus_company_id=self.kwargs.get('bus_company_id')
        ).execute()

    def get_queryset(self):
        return ListBusCompanyStaffUseCase(
            bus_company=self.get_bus_company()
        ).execute()

我怎样才能以这种格式序列化

id  ,
phone_number    ,
position,
email,

【问题讨论】:

    标签: python django django-models serialization django-rest-framework


    【解决方案1】:

    你可以这样做:

    class ListBusCompanyStaffSerializer(serializers.ModelSerializer):
        ...
        phone_number = serializers.CharField(source='user.phone_number')
    
        class Meta:
            model = BusCompanyStaff
            fields = (
                ...
                'phone_number',
            )
    

    【讨论】:

    • 有什么方法可以传入extra_kwargs = {'phone_number':{'source':'?'}
    • 不确定,可以尝试如下extra_kwargs = {'phone_number':{'source': 'user.phone_number'}
    • 当我在 extra_kwargs 中尝试时遇到此错误 Field name user.phone_number` 对模型 BusCompanyStaff 无效。 `
    猜你喜欢
    • 1970-01-01
    • 2022-08-11
    • 1970-01-01
    • 2023-02-03
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多