简体   繁体   English

将对象从视图保存到另一个表 drf

[英]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:模型.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:序列化程序.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:视图.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我有其他视图,在里面我得到输出 parent_success_obj 从中我得到它的 uid 并得到状态字段,我想将这些字段保存在这个表中

    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:和其他字段我正在使用 null 或 date.now() 我应该如何在 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这是有效的,但我该如何编辑它

You need to send this data some how to the view where you are using this ProviderStatusSerilaizer .您需要将此数据发送到您使用此ProviderStatusSerilaizer的视图。 There are many ways to do that.有很多方法可以做到这一点。 One of them is to use session .其中之一是使用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 :现在在您的提供程序序列化程序中,您可以通过 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:并覆盖ProviderStatusSerilaizercreate方法以利用请求对象:

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.仅供参考,请不要使用后缀 id(即<field_name>_id )命名 ForeignKey 字段,因为在下面,django 创建了带有id后缀的字段。 So if you name your FK field abc , django will create a field with abc_id automatically.因此,如果您将 FK 字段命名为abc ,django 将自动创建一个带有abc_id的字段。

Update更新

If you are getting provider_id and status in same view, then you can pass that as context as well.如果您在同一视图中获取provider_idstatus ,那么您也可以将其作为上下文传递。

# 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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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