Использование связанного поля в поле lookup_field в REST-фреймворке Django

У меня есть модель пользователя и модель профиля, которая создается автоматически при регистрации пользователя. В моем представлении для получения профиля пользователя я пытаюсь получить профиль пользователя, используя username, но DRF использует pk по умолчанию. Поэтому я добавил поле поиска с username, но DRF не может его разрешить:

моя profile модель:

class Profile(TimeStampedModel):
    user = models.OneToOneField('User', on_delete=models.CASCADE, related_name='customer_profile')
    bio = models.TextField(blank=True)
    image = models.URLField(blank=True)
    
    def __str__(self):
        return self.user.username

мой profile serializer:

class ProfileSerializer(serializers.ModelSerializer):
    username = serializers.StringRelatedField(source='user.username', read_only=True)
    bio = serializers.CharField(allow_blank=True, allow_null=True)
    image = serializers.SerializerMethodField()
    
    class Meta:
        model = Profile
        fields = ['username', 'bio', 'image']
        
    def get_image(self, obj):
        if obj.image:
            return obj.image
        
        return 'https://static.productionready.io/images/smiley-cyrus.jpg'

мой profile retrieving view:

class ProfileRetrieveAPIView(generics.RetrieveAPIView):
    queryset = Profile.objects.all()
    serializer_class = ProfileSerializer
    lookup_field = 'username'


    def retrive(self, request, username, *args, **kwargs):
        
        try:
            profile = Profile.objects.select_related('user').get(
                user__username = username
            )
        except Profile.DoesNotExist:
            ProfileDoesNotExist
        
        serializer = self.serializer_class(profile)
        
        return Response(serializer.data, status=status.HTTP_200_OK)

конечная точка моего профиля:

urlpatterns = [ 
    # ....
    path('profiles/<str:username>', views.ProfileRetrieveAPIView.as_view()),
]

Я получаю ошибку:

Cannot resolve keyword 'username' into field. Choices are: bio, created_at, id, image, updated_at, user, user_id

Что я делаю не так?

Используйте вложенный серийник.

class UserSerializer(serializers.ModelSerializer):
class Meta:
    model = User
    fields = ('username',)

А в сериализаторе вашего профиля:

  username = UserSerializer(many=False, read_only=True)

Или использовать SerializerMethodField()

username = SerializerMethodField() И определите то, что находится внутри: def username(self,obj): //code

Вы можете использовать это

class ProfileSerializer(serializers.ModelSerializer):
    username = serializers.CharField(source='user.username', read_only=True)
    bio = serializers.CharField(allow_blank=True, allow_null=True)
    image = serializers.SerializerMethodField()
    
    class Meta:
        model = Profile
        fields = ['username', 'bio', 'image']
        
    def get_image(self, obj):
        if obj.image:
            return obj.image
        
        return 'https://static.productionready.io/images/smiley-cyrus.jpg'
Вернуться на верх