afk
afk

Reputation: 558

save objects from views to another table drf

i am trying to save data in this table but i'm getting two field only and all the other i want to add manually

models.py:

class ProviderStatus(UUIDBase):
      provider_id = models.ForeignKey(Provider, to_field="uid", db_column='provider_id', verbose_name=_("Provider id"),on_delete=models.DO_NOTHING)
      created_by = models.ForeignKey(User, to_field="uid", db_column='created_by', verbose_name=_("created by"),on_delete=models.DO_NOTHING, null=True)
      remark = models.TextField(_("Remark"), blank=True, null=True)
      effective_date_from = models.DateField(_("Effective Date From"),auto_now_add=False,auto_now=False, null=True)
      effective_date_to = models.DateField(_("Effective Date To"), null=True)
      provider_status = models.ForeignKey(ProviderStatusChoice, to_field="key", null=True, blank=True, verbose_name=_("Status"), on_delete=models.DO_NOTHING)

serializers.py:

class ProviderStatusSerilaizer(serializers.ModelSerializer):
      class Meta:
            model = ProviderStatus
            fields= ('uid','provider_id','created_by','remark','effective_date_from','effective_date_to','provider_status')

views.py:

i have other view and inside that i'm getting output parent_success_obj from that i'm getting its uid and also getting status field and i want to save these fields in this table

    provider_id =  parent_success_obj.uid  
    provider_status = status 

and other fields i'm taking null or date.now() how should i proceed in views.py:

        if 'parent_success_obj.uid':            
            serializer_obj = ProviderStatusSerilaizer(data=data)
            if serializer_obj.is_valid():
                serializer_obj.save()
            else:
                return CustomeResponse(request=request, comment=FIELDS_NOT_VALID, data=json.dumps(serializer_obj.errors, cls=UUIDEncoder), status=status.HTTP_400_BAD_REQUEST, validate_errors=1)

edits:

        provider_id = parent_success_obj.uid
        provider_status = parent_success_obj.provider_status

        new_data = {"provider_id":provider_id,
                    "remark":"demo remark",
                    "provider_status":provider_status,
                    "created_by": "91bd783f-070a-49ca-a87e-26a4fa157c62",
                    "effective_date_from": "2020-03-03",
                    "effective_date_to": "2020-03-03",

        }

        serializer_obj = ProviderStatusSerilaizer(data=new_data)
        if serializer_obj.is_valid():
            serializer_obj.save()

this is working but how can i edit this

Upvotes: 0

Views: 425

Answers (1)

ruddra
ruddra

Reputation: 51978

You need to send this data some how to the view where you are using this ProviderStatusSerilaizer. There are many ways to do that. One of them is to use session. You can store the these date in session like this:

request.session['provider_id'] = parent_success_obj.uid
request.session['provider_status'] = status

Now in your provider serializer, you can send the request object through context:

if request.session.get('provider_id'):
    serializer_obj = ProviderStatusSerilaizer(data=data,context={'request':request})
    if serializer_obj.is_valid():
        serializer_obj.save()

And override the create method of ProviderStatusSerilaizer to utilize the request object:

class ProviderStatusSerilaizer(serializers.ModelSerializer):
      class Meta:
            model = ProviderStatus
            fields= ('uid','created_by','remark','effective_date_from','effective_date_to',)  # I am removing provider_id and provider_status as I will be injecting this data separately

      def create(self, validated_data):
          request = self.context['request'] 
          provider_id = request.session['provider_id']
          status = request.session['provider_status']
          # Now delete data from sesssion
          del request.session['provider_status']
          del request.session['provider_id']
          validated_data['provider_status'] = status
          validated_data['provider_id'] = provider_id
          return super().create(validated_data)

FYI, please do not name ForeignKey fields with suffix id(ie <field_name>_id), because underneath, django creates the field with id suffix. So if you name your FK field abc, django will create a field with abc_id automatically.

Update

If you are getting provider_id and status in same view, then you can pass that as context as well.

# View
if parent_success_obj.uid:            
    serializer_obj = ProviderStatusSerilaizer(
        data = data,
        context = {
            'provider_id': parent_success_obj.uid,
            'provider_status': status
        }
    )

# Serializer

class ProviderStatusSerilaizer(serializers.ModelSerializer):
    class Meta:
        model = ProviderStatus
        fields= ('uid','created_by','remark','effective_date_from','effective_date_to',)  # I am removing provider_id and provider_status as I will be injecting this data separately

    def create(self, validated_data):
        validated_data.update(self.context) # updating validated data dictionary with context dictionary
        return super().create(validated_data)

Upvotes: 1

Related Questions