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 в сериализаторе данных.