Python 如何使用django从一个API调用创建多个表?

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

我是一名FE开发人员,正在尝试进入Python和Django的世界

为了了解这一点,我正在创建一种模拟交易应用程序。我有两个模型<代码>用户和
用户组合
。目前,我可以通过2个不同的API调用独立创建这两个表。但是,我希望在创建
User
时能够创建
UserPortfolio
。我已在表之间建立了
OneToOne
关系

使用python,高效实现这一点的最佳方法是什么? 特别快的问题是,在Django中,将项目中的模型拆分为它们自己的文件是一种好的做法吗

提前感谢您的帮助!:)

在名为models的文件夹中,my
user.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很有道理!我感谢大家的支持:)