Как искать по полю, унаследованному от OneToOneField другой модели - PullRequest
0 голосов
/ 16 июня 2019

Я пытаюсь найти модель UserProfile, используя поле, унаследованное от модели User.Как я могу получить доступ к полю имени пользователя из модели User в представлении UserProfile?

Я использую Django REST framework 3.9.И, насколько я понимаю, использование аннотации @property в определении модели позволяет сериализовать это поле.И я использую это сериализованное поле как lookup_field в представлении.

Это модель UserProfile.

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField(max_length=500, null=True, blank=True)
    birth_date = models.DateField(null=True, blank=True)

    @property
    def username(self):
        return self.user.username

Это сериализатор.

class UserProfileSerializer(serializers.ModelSerializer):

    class Meta:
        model = UserProfile
        fields = [
            'user',
            'username',
            'bio',
            'birth_date'
        ]

Это представление.

class UserProfileAPIView(generics.RetrieveUpdateAPIView):
    # permission_classes = [permissions.IsAuthenticated]

    serializer_class = UserProfileSerializer
    lookup_field = 'username'

    def get_queryset(self):
        return UserProfile.objects.all()

    def get_serializer_context(self, *args, **kwargs):
        return {'request': self.request}

Это URL-адрес API.

path('<str:username>/profile/', UserProfileAPIView.as_view(), name='profile'),

Я ожидал, что API вернет: username, bio, birth_date, но получил эту ошибку: «Невозможно разрешить ключевое слово« имя пользователя »в поле. Возможные варианты: био, дата рождения, идентификатор, пользователь, идентификатор пользователя» .

1 Ответ

0 голосов
/ 16 июня 2019

@property - это просто поле, вычисляемое питоном, которое будет доступно только после того, как объект станет доступен.Но, чтобы получить объекты, это не может быть использовано.lookup_field требует отношения БД.Как я уже говорил, мы не можем использовать для этого свойство username.Это должно быть lookup_field = 'user__username'.

...