Получил ошибку атрибута при попытке получить значение для поля `phone_number` в сериализаторе

#python #django #django-models #serialization #django-rest-framework

#python #django #django-модели #сериализация #django-rest-framework

Вопрос:

Ошибка атрибута: ошибка атрибута при попытке получить значение для поля phone_number в сериализаторе ListBusCompanyStaffSerializer . В основном у меня есть две модели User и BusCompanyStaff User состоит из поля 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
    )
 

Я в основном хочу перечислить конкретный BusCompanyStaff из BusCompany, так что вот мой сериализатор, который я пробовал до сих пор

 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,
 

Ответ №1:

Вы можете сделать это следующим образом:

 class ListBusCompanyStaffSerializer(serializers.ModelSerializer):
    ...
    phone_number = serializers.CharField(source='user.phone_number')

    class Meta:
        model = BusCompanyStaff
        fields = (
            ...
            'phone_number',
        )
 

Комментарии:

1. есть ли способ, которым я могу передать extra_kwargs = {'phone_number':{'source':'?'} ?

2. не уверен, вы можете попробовать сделать следующее extra_kwargs = {'phone_number':{'source': 'user.phone_number'}

3. получил эту ошибку, когда я попытался в extra_kwargs Field name user.phone_number`недопустимо для модели. ` BusCompanyStaff