简体   繁体   中英

How can I map objects in Django?

Let's assume that I have in my POST method three fields - field1 , field2 , field3 however in POST method field2 and field3 should have the same value during adding to the database. So there is no need to add for instance field2=2 , field3=2 manually. I could add only field1=1 , field2=2 and then field3=2 will be added to this body automatically and finally whole 3 fields will be added to the database. I wonder how it should be done in most optimal way? Should it be done in view? I try in the way shown below.

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__')

May be you can use simple logic, exclude field3 from post serializer, and set it on save method of model

in serializer:

class ObjectPostSerializer(serializers.ModelSerializer):

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

in models:

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)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM