Python 如何使用django从一个API调用创建多个表?
我是一名FE开发人员,正在尝试进入Python和Django的世界 为了了解这一点,我正在创建一种模拟交易应用程序。我有两个模型<代码>用户和Python 如何使用django从一个API调用创建多个表?,python,django,python-3.x,Python,Django,Python 3.x,我是一名FE开发人员,正在尝试进入Python和Django的世界 为了了解这一点,我正在创建一种模拟交易应用程序。我有两个模型用户和用户组合。目前,我可以通过2个不同的API调用独立创建这两个表。但是,我希望在创建User时能够创建UserPortfolio。我已在表之间建立了OneToOne关系 使用python,高效实现这一点的最佳方法是什么? 特别快的问题是,在Django中,将项目中的模型拆分为它们自己的文件是一种好的做法吗 提前感谢您的帮助!:) 在名为models的文件夹中,myu
用户组合
。目前,我可以通过2个不同的API调用独立创建这两个表。但是,我希望在创建User
时能够创建UserPortfolio
。我已在表之间建立了OneToOne
关系
使用python,高效实现这一点的最佳方法是什么?
特别快的问题是,在Django中,将项目中的模型拆分为它们自己的文件是一种好的做法吗
提前感谢您的帮助!:)
在名为models的文件夹中,myuser.py
如下所示:
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, \
PermissionsMixin
from .user_portfolio import UserPortfolio
class UserManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields):
"""Creates and saves new user"""
if not email:
raise ValueError('Email address is required')
user = self.model(email=self.normalize_email(email), **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
class User(AbstractBaseUser, PermissionsMixin):
"""Custom user model that supports using email instead of username"""
email = models.EmailField(max_length=255, unique=True)
first_name = models.CharField(max_length=255)
last_name = models.CharField(max_length=255)
date_of_birth = models.CharField(max_length=255)
phone_number = models.IntegerField(null=True)
is_active = models.BooleanField(default=True)
last_login = models.DateTimeField(auto_now_add=True)
created_on = models.DateTimeField(auto_now_add=True)
objects = UserManager()
USERNAME_FIELD = 'email'
在另一个文件user\u portfolio.py
中,我有一个模型,它如下所示:
from django.db import models
from django.conf import settings
class UserPortfolioManager(models.Manager):
"""User Portfolio Manager"""
def create_user_portfolio(self, user_id, **extra_fields):
user_portfolio = self.model(user_id=user_id, **extra_fields)
user_portfolio.save(using=self._db)
return user_portfolio
class UserPortfolio(models.Model):
"""User portfolio model"""
amount_invested = models.FloatField()
profits = models.IntegerField(default=0)
loss = models.IntegerField(default=0)
user = models.OneToOneField(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE
)
objects = UserPortfolioManager()
def __str__(self):
return 'Created!'
我有一个用于序列化程序的文件:
from django.contrib.auth import get_user_model
from rest_framework import serializers
from core.models import UserPortfolio
class UserPortfolioSerializer(serializers.ModelSerializer):
"""Serialzier from user portfolio object"""
class Meta:
model = UserPortfolio
fields =(
'id',
'amount_invested',
'profits',
'loss',
)
read_only_fields = ('id',)
def create(self, validated_data):
print(validated_data)
return UserPortfolio.objects.create_user_portfolio(user_id=user_id, **validated_data)
class UserSerializer(serializers.ModelSerializer):
"""Serializer for users object"""
class Meta:
model = get_user_model()
fields = (
'email',
'password',
'first_name',
'last_name',
'date_of_birth',
'phone_number'
)
extra_kwargs = {'password': {'write_only': True, 'min_length': 5}}
def create(self, validated_data):
"""Create a new user with encrypted password and return it"""
return get_user_model().objects.create_user(**validated_data)
和我的views.py
文件:
from rest_framework import generics, viewsets, mixins, serializers
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated
from core.models import UserPortfolio
from user.serializers import UserSerializer, UserPortfolioSerializer
class CreateUserView(generics.CreateAPIView):
"""Create new user in the system"""
serializer_class = UserSerializer
class CreateUserPortfolioView(generics.CreateAPIView):
serializer_class = UserPortfolioSerializer
我目前的理解是,user\u公文包
表将有一个user\u id
,它引用公文包所属的用户。
一个公文包对于一个用户来说应该是唯一的,并且只能由一个用户拥有,然后一个用户只能拥有一个公文包 您可以通过更改其中一个序列化程序中的逻辑来实现这一点。我将把您的
UserPortfolioSerializer
更改为如下内容
类UserPortfolioSerializer(serializers.ModelSerializer):
类元:
模型=用户组合
田地=(
“id”,
“用户”,
“投资额”,
"利润",,
“损失”,
)
只读字段=('id',)
def创建(自我验证的_数据):
用户\数据=已验证\数据.pop(用户)
user=user.objects.create\u user(**用户\u数据)
返回UserPortfolio.objects.create_user_公文包(user=user,**已验证的_数据)
现在您需要更改输入格式,如下所示:
{
"user": {
....
# user information here
....
}
....
# user portfolio information here
....
}
这是解决您的问题的主要思路。我想你明白了:)。通过此操作,您可以在序列化程序内部执行任何逻辑更改。您可以在此处将逻辑添加到序列化程序部分。使用一个序列化程序创建实例,并在那里执行逻辑。@dipesh感谢您的回答:)您是否建议将此
UserPortfolio.objects.create\u user\u portfolio(user\u id=user\u id,**validated\u data)
添加到UserSerializer内的create方法?还是需要两者都返回?是的,我给你一个简单的答案。希望这对你有帮助:)非常感谢!这个答案是甜蜜的,直截了当的,简单易懂。如果问题不多,您是否介意向我解释一下UserPortfolioSerializer
是如何从用户
接收数据的@我们在UserPortfolioSerializer
中使用model序列化程序
,而UserPortfolioSerializer
的模型是UserPortfolioSerializer
,它与用户
模型具有一对一的关系。在这里,所有幕后工作都由模型序列化程序执行。我希望这个答案能支持你:)@aronarguelloit很有道理!我感谢大家的支持:)