Django/React/Postgres One-to-Many не обновляет столбец hero_id до user_id

Я пытаюсь хранить UsersHeroes в базе данных UserAccount, используя реляционную базу данных "один-ко-многим". Кажется, что все работает нормально, когда я вручную устанавливаю UserHero на сайте администратора, чтобы он относился к пользователю, но когда дело доходит до попытки отправить его на фронт-энде, он просто устанавливает его по умолчанию на 1, так как я установил его таким образом в модели. Если я вхожу в систему как пользователь id = 2 и создаю героя с этим пользователем, он сохранит его только для пользователя id = 1. Вот как настроены мои модели:

class UserAccountManager(BaseUserManager):
    def create_user(self, email, name, password=None): #allows you to create user 
        if not email: 
            raise ValueError("Adventurers must have an email address or you shall not pass.")

            
        email = self.normalize_email(email) #normalize is a built in function to normalize email
        user = self.model(email = email, name = name) #normalizes capital to lowercase

        user.set_password(password) #hashes password for security and sets database 
        # if hacker hacks database you see it 
        user.save() #saves the user

        return user

    def create_superuser(self, email, name, password=None ):
        u = self.create_user(email, name, password)
        u.is_staff = True
        u.is_active = True
        u.is_superuser = True
        u.save(using=self._db)

        return u


class UserAccount(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(max_length = 255, unique = True)
    name = models.CharField(max_length = 255)
    # id = models.IntegerField(unique=True)
    # date_of_birth = models.DateField(max_length=8)
    is_active = models.BooleanField(default = True)
    is_staff = models.BooleanField(default = False)

    objects = UserAccountManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['name']

    def get_fullname(self):
        return self.name 
    
    def get_short_name(self): 
        return self.name

    # def get_DOB(self):
    #     return self.date_of_birth

    def __str__(self): 
        return self.email


class UsersHeroes(models.Model):
    name = models.CharField(max_length = 255)

    race_type = models.CharField(max_length= 255, default="")
    class_type = models.CharField(max_length= 255, default="")
    #do we need to replace 8 with the variable name from front end??
    STR = models.IntegerField()
    DEX = models.IntegerField()
    CON = models.IntegerField()
    INT = models.IntegerField()
    WIS = models.IntegerField()
    CHA = models.IntegerField()

    def get_heroname(self):
        return self.name 

    def get_race(self):
        return self.race_type

    def get_class(self):
        return self.class_type

    def get_str(self):
        return self.STR   
    
    def get_dex(self):
        return self.DEX

    def get_con(self):
        return self.CON

    def get_int(self):
        return self.INT

    def get_wis(self):
        return self.WIS

    def get_cha(self):
        return self.CHA
        
    hero = models.ForeignKey(UserAccount, default = 1, on_delete=models.CASCADE)    
    
# Create your models here.

Это мой Serializer.py

from rest_framework import serializers
from djoser.serializers import UserCreateSerializer
from django.contrib.auth import get_user_model
from . models import *
User = get_user_model()

class UserCreateSerializer(UserCreateSerializer):
    class Meta(UserCreateSerializer.Meta):
        model = User
        fields = ('id', 'email', 'first_name', 'last_name', 'password')

class UsersHeroesSerializer(serializers.ModelSerializer):
    class Meta: 
        model = UsersHeroes
        fields = ['name', 'race_type', 'class_type', 
                'STR', 'DEX', 'CON', 'INT', 'WIS', 'CHA']
        parent = UserCreateSerializer(many=False)

вот мой views.py

from django.shortcuts import render
from rest_framework.views import APIView
from . models import *
from rest_framework.response import Response
from . serializers import *
from django.views.decorators.csrf import csrf_exempt
# Create your views here.
  
class ReactView(APIView):
    
    serializer_class = UsersHeroesSerializer

    @csrf_exempt
    def get(self, request):
        detail = [ {"name": detail.name,
        "race_type": detail.race_type, 
        "class_type": detail.class_type,
        "STR" : detail.STR, 
        "DEX" : detail.DEX,
        "CON" : detail.CON,
        "INT" : detail.INT,
        "WIS" : detail.WIS,
        "CHA" : detail.CHA,
        "hero": detail.hero
        } 
        for detail in UsersHeroes.objects.all()]
        return Response(detail)
  
    @csrf_exempt
    def post(self, request):
  
        serializer = UsersHeroesSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return  Response(serializer.data)

А запрос Post для сохранения героев находится в моей папке react front end следующим образом: index.js начиная со строки 43 (выше просто переменные)

    const onSubmit = (e) => {
        e.preventDefault();

        const postData = {
            name,
            race_type: selectedRace,
            class_type: selectedClass,
            STR: valueStr,
            DEX: valueDex,
            CON: valueCon,
            INT: valueInt,
            WIS: valueWis,
            CHA: valueCha,
        };

        Axios.post(`${process.env.REACT_APP_API_URL}/heroes/`,
        postData, )
        .then((res) => {
            console.log(res);
        })
        .catch((err) => {
            console.error( err ) ;
        });

    }
    //*************************************************/


    const [raceOptions, setRaceOptions] = useState([]);

он не обновляет столбец hero_id в моем postgres, пока я не сделаю это вручную на сайте администратора. Если кто-нибудь может помочь, было бы здорово!

Обновите ваш UsersHeroesSerializer и список полей добавьте в него hero.

class UsersHeroesSerializer(serializers.ModelSerializer):
    class Meta: 
        model = UsersHeroes
        fields = ['name', 'race_type', 'class_type', 
                'STR', 'DEX', 'CON', 'INT', 'WIS', 'CHA', 'hero']
        parent = UserCreateSerializer(many=False)

и ваше представление корректирует userAccount из request.user и присваивает его как hero в сериализаторе данных.

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