Вложенный сериализатор для внешних ключей

У меня есть две модели - Users и UserAccessLogs:

class Users(AbstractUser):
    email = models.EmailField()
    name = models.Charfield()
    etc.

class UserAccessLogs(AbstractUser):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
    anotherField = models.Charfield()
    etc.

с сериализаторами:

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = Users
        fields = '__all__'

    def validate_email(self, value):
        # validations here

    def update(self, instance, validated_data):
        instance.email = validated_data['email'] 
        etc.
        instance.save()
        return instance

class UserAccessLogsSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserAccessLogs
        fields ='__all__'

В моей функции представления я хотел бы получить фактический класс пользователя при получении UserAccessLogs т.е. я хотел бы:

UserAccessLogs = {
   user : {
           email: myEmail,
           name: myName, 
           etc.
          }
}

вместо

UserAccessLogs = {
   user : 1
}

в моих взглядах:

access_logs = UserAccessLogs.objects.all()
serializer = UserAccessLogsSerializer(access_logs, many = True)
return Response(serializer.data, status.HTTP_200_OK)

Я попробовал добавить user = UserSerializer() в класс UserAccessLogsSerializer. Это работает, но затем, когда я пытаюсь сохранить новый экземпляр UserAccessLogs, я получаю ошибки, связанные с моделью User от валидаторов. Если я устанавливаю read_only = True, то в базе данных остается user = null. Нижеприведенное работает в моем классе представлений, но оно не кажется эффективным и должно повторяться каждый раз, когда я хочу получить полный UserAccessLogs.

for data in serializer.data:
      data['user'] = UserSerializer(User.objects.get(id = data['user'])).data

создайте два сериализатора в serializer.py

class User_serializer(serializers.ModelSerializer):
    class Meta:
        model = Users
        fields = '__all__'
    
class User_access_serializer(serializers.ModelSerializer):
    class Meta:
        model = UserAccessLogs
        fields = '__all__'
    user = User_serializer()
    

в тебе API:

UserAccessLogs_queryset = UserAccessLogs.objects.all()
serializer_class = User_access_serializer(UserAccessLogs_queryset ,many=True)
return Response(serializer_class.data)

он создаст nested API так, как вам нужно

Также я предполагаю, что у вас есть ошибка при выполнении класса UserAccessLogs. по (AbstractUser) похоже, что вам нужно class UserAccessLogs(models.Model):

попробуйте это

user = UserSerializer(read_only=True)
user_id = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(), source='user')
Вернуться на верх