Django: поиск пользовательского поля OnetoOne с использованием имени пользователя с наборами видов моделей (Django Rest API) - PullRequest
0 голосов
/ 01 марта 2020

Моя задача состоит в том, чтобы администратор в моем приложении мог создавать и обновлять данные сотрудника. Учитывая, что пользовательская модель django упрощает аутентификацию, я использовал ее в качестве OnetoOneField в моей модели Employee, представляя ключ в качестве идентификатора сотрудника (имя пользователя).

Моя модель -

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 с возможностью просмотра Speci c Сотрудник отфильтрован по идентификатору пользователя

Как показано на рисунке, поле пользователя показывает мне pk вместо user.username.

Я вижу имя пользователя в форме HTML для POST в API с возможностью просмотра, однако json не возвращает имя пользователя по умолчанию и скорее возвращает pk.

I хотите иметь возможность искать и обновлять данные сотрудника на основе имени пользователя (идентификатор сотрудника).

То, что я пробовал -

Я попытался переопределить поле пользователя как SerializedMethodField, которое возвращает user.username, но для поиска и метода POST по-прежнему требуется pk вместо имени пользователя, поэтому он не ' не решить проблему для меня.

Вложенные serialziers делают вложенный сериализатор доступным только для чтения, что опять-таки делает мою задачу обновления сведений о сотруднике нежелательной.

Как я могу искать объект сотрудника на основе user.username вместо pk ?

Как я могу связать существующий объект пользователя с объектом сотрудника во время создания с именем пользователя объекта пользователя с использованием наборов моделей? Есть ли способ решить эту проблему без необходимости переопределять или писать свои собственные функции создания и обновления для набора моделей?

...