Как удалить детали, связанные с одним полем, в Djang Rest Framework?

Здравствуйте, рассмотрим следующий простой сценарий:

class User(models.Model):
     email = ...
     fname = ...
     lname = ...

class UserPreferences(models.Model):
     user = models.OneToOneField(User, to_field="email", ...)
     preferences = ...

Теперь таблица UserPreferences в db содержит id, preferences, user_id.

Я хочу получить предпочтения пользователя по электронной почте.

Я хочу использовать RetrieveAPIView.

Как это сделать?

Какова роль to_field, если он все равно хранит id пользователя?

Я попробовал следующее:

class UserPreferencesRetrieveView(generics.RetrieveAPIView):
    serializer_class = UserPreferencesSerializer
    queryset = UserPreferences.objects.all()
    lookup_field = "email"

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

Cannot resolve keyword 'email' into field. Choices are: id, preferences, user, user_id

Чтобы ответить на ваш вопрос, вы должны использовать метод get_queryset с вашим URL kwargs:

class UserPreferencesRetrieveView(generics.RetrieveAPIView):
    serializer_class = UserPreferencesSerializer

    def get_queryset(self):
        email = self.kwargs['email']
        return UserPreferences.objects.filter(user__email=email)

или

Если вы хотите использовать lookup_field, то вам следует сделать что-то вроде этого lookup_field = 'user__email' в наборе представлений:

class UserPreferencesRetrieveView(generics.RetrieveAPIView):
    serializer_class = UserPreferencesSerializer
    queryset = UserPreferences.objects.all()
    lookup_field = 'user__email'

и использование to_field

Поле связанного объекта, к которому относится отношение. По умолчанию Django использует первичный ключ связанного объекта. Если вы ссылаетесь на другое поле, то оно должно иметь значение unique=True. подробнее docs

Вернуться на верх