1

假设我在我的POST方法中有三个字段 - field1,field2,field3但是在POST方法field2field3在添加到数据库期间应该具有相同的值。因此不需要手动添加例如field2=2,field3=2。我只能添加field1=1,field2=2,然后field3=2将自动添加到本体中,最后将整个3个字段添加到数据库中。我想知道应该如何以最优化的方式来完成?是否应该在视野内完成?我尝试以下面的方式。如何在Django中映射对象?

views.py:

class UserObject(GenericAPIView): 

    def get_serializer_class(self, *args, **kwargs): 
     if self.request.method == 'POST': 
      return ObjectPostSerializer 
     return ObjectSerializer 

    def post(self, request, user_id): 

     serializer = ObjectPostSerializer(data=request.data) 
     if serializer.is_valid(): 
      serializer.save(user_id=user_id) 
      return Response(serializer.data, status=status.HTTP_201_CREATED) 
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

serializers.py:

class ObjectPostSerializer(serializers.ModelSerializer): 

    def __init__(self, *args, **kwargs): 
     super(ObjectPostSerializer, self).__init__(*args, **kwargs) 

     for key in self.fields: 
      self.fields['field3'].required = False 

    class Meta: 

     model=Object 
     field3 = model.field2 

     fields = ('__all__') 
+0

如果'field2'和'field3'将永远在数据库中的值相同,为什么这两个领域需要的?难道你不能废除其中一个吗?但是要回答这个问题,一个好的方法是编写serializer.save(),这样它就会忽略field3的值,并为两个数据库列使用field2的值。 –

+0

@JohnGordon由于将来只有field2会更新,field3意味着初始值。你可以看看更新的问题中的代码吗?我该如何解决它? – wahtdbogh

+0

我对Django对象序列化程序没有任何经验,所以我不能评论具体细节,但似乎你有正确的想法。 –

回答

1

可能是你可以用简单的逻辑,从后串行排除field3,并将它放在模型

save方法

in serializer:

class ObjectPostSerializer(serializers.ModelSerializer): 

    class Meta: 
     model=Object 
     exclude = ('field3',) 

在车型:

class Object(model.Model): 
    # YOU FIELDS DECLARE HERE 

    def save(self, *args, **kwargs): 
     if not self.pk: 
      self.field3 = self.field2 
     super(Object, self).save(*args, **kwargs) 
+0

但是在'PUT'或'GET'等其他方法中,我需要整个模型。只有'POST'我想少用一个字段。 – wahtdbogh

+0

为什么您的序列化程序的名称是“PostSerializer”? –

+0

因为对于POST方法,我试图创建分离的序列化程序 - “ObjectPostSerializer”。对于其他方法有'ObjectSerializer'。 – wahtdbogh