繁体   English   中英

Django/React/Postgres 一对多不会将 hero_id 列更新为 user_id

[英]Django/React/Postgres One-to-Many wont update hero_id column to 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 前端文件夹中,如下所示: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([]);

它不会更新我的 postgres 上的 hero_id 列,除非我在管理站点上手动更新。 如果有人可以帮助那就太好了!

更新您的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)

并且您的视图更正了request.useruserAccount并将其分配为序列化程序数据中的英雄。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM