列出序列化程序多对象创建

时间:2018-08-23 07:25:13

标签: django serialization django-rest-framework

我的模特是:

class User(models.Model):
    id = models.AutoField(primary_key=True)
    email = models.EmailField()


class Lawyer(models.Model):    
    user = models.OnetoOneField(User)


class Session(models.Model):
    name = models.CharField()
    lawyer = models.ForeignKey(Lawyer)

我正在尝试使用会话的列表序列化程序创建多个对象。
从应用程序方面,他们没有律师的身份证,但有每个律师的电子邮件。如何编写列表序列化程序,以便在其中接受以下json输入并使用电子邮件来获取律师来存储多个会话对象?

发送的json输入如下:

[
    {
        "name": "sess1",
        "email": "lawyer1@gmail.com",
    },
    {
        "name": "sess1",
        "email": "lawyer1@gmail.com",
    }
]

2 个答案:

答案 0 :(得分:4)

您可以通过这种方式进行操作,但我认为电子邮件应为unique=True

然后使用这样的序列化器:

from django.utils.translation import ugettext_lazy as _

class SessionCreateManySerializer(serializers.ModelSerializer):
    email = serializers.SlugRelatedField(
        source='lawyer',
        slug_field='user__email',
        queryset=Lawyer.objects.all(),
        write_only=True,
        error_messages={"does_not_exist": _('lawyer with email={value} does not exist.')}
)

    class Meta:
        model = Session
        fields = ('name', 'email')

和通用的创建视图(只需覆盖create方法,并在调用many=True时将get_serializer传递给序列化程序):

from rest_framework.response import Response
from rest_framework import generics

class SessionCreateManyView(generics.CreateAPIView):
    serializer_class = SessionCreateManySerializer

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data, many=True)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)

        return Response(
            serializer.data,
            status=status.HTTP_201_CREATED,
            headers=headers
        )

答案 1 :(得分:1)

您也可以使用批量创建:

# serializers.py
from myapp.models import Session
from rest_framework import serializers


class SessionSerializer(serializers.Serializer):
    email = serializers.EmailField(required=True)
    name = serializers.CharField(required=True)

    def validate_email(self, email):
        lawyer = Lawyer.objects.filter(user__email=email).first()

        if not lawyer:
            raise ValidationError(detail="user dose not exist.")

        return lawyer

    def create(self, validated_data):
        return Session.objects.create(name=validated_data.get('name'), lawyer=validated_data.get('email'))

并在您的api.py文件中允许批量创建:

# api.py
from rest_framework import generics

class SessionCreateAPIView(generics.CreateAPIView):
    """Allows bulk creation of a resource."""
    def get_serializer(self, *args, **kwargs):
        if isinstance(kwargs.get('data', {}), list):
            kwargs['many'] = True

        return super().get_serializer(*args, **kwargs)