代码之家  ›  专栏  ›  技术社区  ›  Piero Pajares

如何在单柱双桌onetoone-django中保存

  •  0
  • Piero Pajares  · 技术社区  · 6 年前

    我有两个模型:

    class User(AbstractUser):
        TYPES = (('A', 'Administrador'), ('P', 'Persona'), ('C', 'Corporativo'), ('E', 'Emprendedor'), ('R', 'Reciclador'))
    
        login_type = models.CharField(max_length=1, blank=True, null=True)
        account_type = models.CharField(max_length=1, choices=TYPES, blank=True, null=True)
        picture_url = models.CharField(max_length=200, blank=True)
        is_deleted = models.BooleanField(default=False)
    
    
    class EcoUser(models.Model):
        user = models.OneToOneField(User, related_name='eco_user')
        document = models.CharField(max_length=45, blank=True)
        phone_number = models.CharField(max_length=45, blank=True)
        ubigeo = models.CharField(max_length=6, blank=True)
        address = models.CharField(max_length=500, blank=True)
        location = models.CharField(max_length=200, blank=True)
    
        def __str__(self):
            return str(self.user)
    

    当我想添加一个 用户 它也保存在 生态用户

    我想把它们放在一起 序列化程序 这两个模型使用 创造 工作方式如下:

    class UserSerializer(serializers.ModelSerializer):
    
    def to_representation(self, instance):
        representation = super(UserSerializer, self).to_representation(instance)
        eco_user = EcoUser.objects.filter(user_id=instance.id)[0]
        representation['document'] = eco_user.document
        representation['phone_number'] = eco_user.phone_number
        representation['ubigeo'] = eco_user.ubigeo
        representation['address'] = eco_user.address
        return representation
    
    
    class Meta:
        model = User
        fields = ('id',
                  'username',
                  'password',
                  'first_name',
                  'last_name',
                  'email',
                  'login_type',
                  'account_type',
                  'picture_url',
                  'is_deleted'
                  )
        extra_kwargs = {'password': {'write_only': True, 'required': False}}
    

    然而,它只起到了 列表 但不是为了 创造 . 这是我的 视图集 以下内容:

    class EcoUserViewSet(viewsets.ModelViewSet):
        serializer_class = UserSerializer
        queryset = User.objects.exclude(is_deleted=True)
        pagination_class = None
    
    
        @transaction.atomic
        def create(self, request, *args, **kwargs):
            with transaction.atomic():
                try:
                    data = request.data
                    serializer = self.get_serializer(data=data)
                    if serializer.is_valid(raise_exception=True):
                        serializer.save()
                        return Response({"status": True, "results": "Datos guardados correctamente"},
                                        status=status.HTTP_201_CREATED)
                except ValidationError as err:
                    return Response({"status": False, "error_description": err.detail}, status=status.HTTP_400_BAD_REQUEST)
    

    如何在一篇文章中保存Ecouser数据?

    更新 json发送示例:

    {
      username: "demo",
      firstname: "demin",
      lastname: "demon"
      login_type: "0",
      #ecouser fields
      account_type: "A",
      document: "74578778",
      phone_number: "54545445",
      ubigeo: "32114",
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Ali    6 年前

    您需要两个序列化程序,一个用于User,另一个用于EcoUser。

    class UserSerializer(serializers.ModelSerializer):
        class Meta:
            model = User
            fields = (your desire fields)
        def create(self, validated_data):
            #codes
    
    
    class EcoUserSerializer(serializers.ModelSerializer):
        user = UserSerializer()
        class Meta:
            model = EcoUser
            fields = (
               'user',
               other fields
            )
        def create(self, validated_data):
            #codes
    

    然后为ecouserserializer编写一个视图