经过多年的Java编写工作,我得到了一个有趣的项目,即将使用python django rest框架进行开发。
我有一个具有许多关系的复杂模型,其中我想基于一个JSON请求在数据库中创建实体。请参考我的数据库模型的屏幕截图。
我的目标是在数据库中创建公司的地方创建新项目,自由职业者可以向公司的项目提出建议。
我想要一个包含以下内容的JSON请求
当我在服务器上收到请求时,我想先检查自由职业者是否存在(我通过电子邮件查找),然后使用其ID或创建一个新的自由职业者实体,然后创建一个新的Project条目(我也可以检查我没有名字和年份的重复-在这种情况下会抛出错误),并使用相关FK为项目创建新任务,并为Requests创建相同的任务。
根据我在JEE方面的经验,我将简单地创建一个反映JSON的DTO,并且将只有一个服务层来检查条件并相应地创建对象。
我有点不知道如何使用django,我看到的所有教程都提供了一种非常清晰的方法,如何对几乎以1比1映射到JSON(DTO)的数据库模型进行简单的CRUD操作。那里没有业务逻辑。
有人可以让我知道如何解决这个问题吗?也许您有什么好的例子可以参考?
谢谢。
答案 0 :(得分:1)
各个序列化程序用于字段验证,因此没有恶意数据。
from django.db import transaction
from rest_framework import serializers
class FreeLancerSerializer(serializers.ModelSerializer):
class Meta(object):
model = FreeLancer
fields = ('email', '...other field')
class TasksSerializer(serializers.ModelSerializer):
class Meta(object):
model = Task
fields = (..task model fields..)
class RequestsSerializer(serializers.ModelSerializer):
class Meta(object):
model = Request
fields = (..request model fields..)
class ProjectSerializer(serializers.ModelSerializer):
freelancer = FreeLancerSerializer()
tasks = TasksSerializer(many=True)
requests = RequestsSerializer(many=True)
class Meta(object):
model = Project
fields = ('project_name', ..project model fields .., 'freelancer', 'tasks', 'requests')
#project_name validation
def validate_project_name(self, project_name):
if Project.objects.filter(project_name=project_name).exists():
raise serializers.ValidationError("project with this name already exists.")
return project_name
@transaction.atomic #will rollback all the transactions if something fails
def create(self, validated_data):
freelancer = validated_data.pop('freelancer')
tasks_data = validated_data.pop('tasks')
requests_data = validated_data.pop('requests')
# gets the freelancer if alread created else creates it.
freelancer_obj = FreeLancer.objects.get_or_create(
email = freelancer.get('email'),
defaults = freelancer
)
validated_data['freelancer'] = freelancer_obj
project = super(ProjectSerializer, self).create(validated_data)
#Validates tasks data and creates tasks
try:
task_objects = TasksSerializer(data=tasks_data, many=True)
task_objects.is_valid(raise_exception=True)
tasks = task_objects.save()
project.tasks.add(tasks); #add tasks to project.
except:
raise serializers.ValidationError("tasks not valid.")
#Validates requests data and creates requests
try:
request_objects = RequestsSerializer(data=requests_data, many=True)
request_objects.is_valid(raise_exception=True)
requests = request_objects.save()
project.requests.add(requests); #add requests to project.
except:
raise serializers.ValidationError("requests not valid.")
project.save()
return project
注意:还需要模型级别的验证,例如自由职业者的email
必须是unique
,而name
则必须是unique
项目模型,依此类推。 / p>
PS:您可能需要做一些更改。