Использование связанного поля в поле 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'