Как удалить детали, связанные с одним полем, в 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