Моя задача состоит в том, чтобы администратор в моем приложении мог создавать и обновлять данные сотрудника. Учитывая, что пользовательская модель django упрощает аутентификацию, я использовал ее как OnetoOneField в моей модели сотрудников, представляя ключ как идентификатор сотрудника (имя пользователя).
Моя модель -
class Employee(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
name = models.CharField(max_length=50, unique=True)
date_of_join = models.DateField(blank=True, null=True)
date_of_birth = models.DateField(blank=True, null=True)
designation = models.CharField(max_length=255, null=True)
mobile = models.CharField(max_length=255, null=True)
personal_email = models.CharField(max_length=255, blank=True, null=True)
official_email = models.CharField(max_length=255, blank=True, null=True)
current_station = models.CharField(
max_length=255, default="Chennai", null=True)
def __str__(self):
return self.name
Сериализаторы -
class EmployeeSerializer(serializers.ModelSerializer):
class Meta:
model = Employee
fields = ('user', 'name', 'date_of_join', 'date_of_birth',
'designation', 'mobile', 'landline', 'personal_email',
'official_email', 'current_station')
Мой набор представлений модели:
class EmployeeListSet(viewsets.ModelViewSet):
lookup_field = 'user'
serializer_class = EmployeeSerializer
queryset = Employee.objects.all()
API для просмотра определенного сотрудника, отфильтрованный по идентификатору пользователя
Как показано на изображении, в поле пользователя отображается pk вместо user.username.
Я могу видеть имя пользователя в HTML-форме для POST в доступном для просмотра API, однако json по умолчанию не возвращает имя пользователя, а возвращает pk.
Я хочу иметь возможность искать и обновлять информацию о сотруднике на основе имени пользователя (идентификатора сотрудника).
Что я пробовал -
Я попытался переопределить поле пользователя как SerializedMethodField, которое возвращает user.username, но метод поиска и POST по-прежнему требует pk вместо имени пользователя, поэтому это не решает проблему для меня.
Вложенные сериализаторы делают вложенный сериализатор доступным только для чтения, что снова делает мою задачу по обновлению сведений о сотрудниках нежелательной.
Как я могу найти объект сотрудника на основе user.username вместо pk?
Как я могу связать существующий объект пользователя с объектом сотрудника во время создания с именем пользователя объекта пользователя, используя наборы моделей? Есть ли способ решить эту проблему без переопределения или написания собственных функций создания и обновления для набора моделей?