【问题标题】:Save multiple models in a single post - Django rest frameweok在一篇文章中保存多个模型 - Django rest 框架
【发布时间】:2018-08-04 22:04:33
【问题描述】:

我有 4 个模型

class User(AbstractEmailUser):
    first_name = models.CharField(max_length=100, blank=True)
    last_name = models.CharField(max_length=100, blank=True)

class Event(models.Model):
    name = models.CharField(max_length=200)
    address = models.CharField(max_length=200)
    date = models.DateField()

class EventLocation(models.Model):
    event = models.ForeignKey(Event)
    ubigeo = ArrayField(models.CharField(max_length=200), blank=True)

class EventStaff(models.Model):
    recycler = models.ForeignKey(User)
    event = models.ForeignKey(Event)

如果我想注册一个活动并能够在创建时将用户分配到同一出版物,请分配或不分配用户。我已经创建了一个 nested serialier,在文档中进行了很好的解释,以便保存事件,同时保存在 EventLocation 表的 ubigeo 字段中(该区域的代码地点):

Class EventLocationSerializer(serializers.ModelSerializer):

    class Meta:
        model = EventLocation
        fields = ('id', 'ubigeo')

class EventSerializer(serializers.ModelSerializer):
event_location = EventLocationSerializer(required=True, write_only=True)

def to_representation(self, instance):
    representation = super(EventSerializer, self).to_representation(instance)
    event_location = EventLocation.objects.filter(event=instance.id)
    if event_location:
        representation['event_location'] = event_location.values('ubigeo')[0]
    return representation

class Meta:
    model = Event
    fields = ('id', 'date', 'name', 'address', 'schedule', 'event_location')

def create(self, validated_data):
    location_data = validated_data.pop('event_location')
    event = Event.objects.create(**validated_data)
    EventLocation.objects.create(event=event, **location_data)
    return event

它可以正常工作,但是如何同时添加要分配给事件的用户?我知道我必须将它们保存在 EventStaff 表中,但是如何将它们插入到同一个帖子中?

这是我的视图集

@transaction.atomic
    def create(self, request, *args, **kwargs):
        with transaction.atomic():
            try:  
                data = request.data
                serializer = EventSerializer(data=data)
                if serializer.is_valid(raise_exception=True):
                    serializer.save()
                    return Response({"status": True, "results": "Evento registrado correctamente"},
                                    status=status.HTTP_201_CREATED)
            except ValidationError as err:
                return Response({"status": False, "error_description": err.detail}, status=status.HTTP_400_BAD_REQUEST)

这是json格式:

{
    "date": "2018-03-01",
    "name": "La prueba reciclaje",
    "address": "Av españa trujillo",
    "users": [
        {"id": 40, "first_name": "Raul"},
        {"id": 23, "first_name": "ALejandro"}
    ],
    "eventlocation": {
        "ubigeo": ["130101"]
    }
}

【问题讨论】:

    标签: django django-models django-rest-framework


    【解决方案1】:

    在我看来,我们可以自定义您的 def 创建更多。 所以我们为用户创建一个序列化器,获取参数用户并在事件保存后保存。 可能是这样的:

    @transaction.atomic
    def create(self, request, *args, **kwargs):
        with transaction.atomic():
            try:
                data = request.data
                serializer = EventSerializer(data=data)
                if serializer.is_valid(raise_exception=True):
                    serializer.save()
                    // recheck , this loop have input is all users in json
                    for user in data.get('users'):
                        user_serializer = UserSerializer(data=user)
                        if user_serializer.is_valid(raise_exception=True):
                            user_serializer.save()
                    return Response({"status": True, "results": "Evento registrado correctamente"},
                                    status=status.HTTP_201_CREATED)
            except ValidationError as err:
                return Response({"status": False, "error_description": err.detail}, status=status.HTTP_400_BAD_REQUEST)
    

    支持这个帮助

    【讨论】:

    • 非常感谢您的回答,但我不需要创建新用户,我只想将已经创建的用户与事件相关联。但是你给了我一个想法。
    • 我想我会在创建后得到事件的 pk,并且我会得到 json 用户的 id。将它们保存在 eventstaff 表中。
    【解决方案2】:

    正如我在评论中所说,它非常有效:D

    @transaction.atomic
        def create(self, request, *args, **kwargs):
            with transaction.atomic():
                try:  
                    data = request.data
                    users = request.data.get('users', None)
                    serializer = EventSerializer(data=data)
                    if serializer.is_valid(raise_exception=True):
                        instance = serializer.save()
                        if users:
                            for user in users:
                                EventStaff.objects.create(recycler_id=user['id'], event_id=instance.id)
                        return Response({"status": True, "results": "Evento registrado correctamente"},
                                        status=status.HTTP_201_CREATED)
                except ValidationError as err:
                    return Response({"status": False, "error_description": err.detail}, status=status.HTTP_400_BAD_REQUEST)
    

    【讨论】:

      猜你喜欢
      • 2015-04-12
      • 2016-05-30
      • 2021-12-26
      • 1970-01-01
      • 2017-01-04
      • 1970-01-01
      • 2014-08-27
      • 2018-01-27
      • 1970-01-01
      相关资源
      最近更新 更多