![](/img/trans.png)
[英]Django auth.models User One-To-Many (1048, “Column 'user_id' cannot be null”)
[英]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.user
的userAccount
并将其分配为序列化程序数据中的英雄。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.