簡體   English   中英

將對象從視圖保存到另一個表 drf

[英]save objects from views to another table drf

我正在嘗試將數據保存在此表中,但我只得到兩個字段,而其他所有字段我想手動添加

模型.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)

序列化程序.py:

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

視圖.py:

我有其他視圖,在里面我得到輸出 parent_success_obj 從中我得到它的 uid 並得到狀態字段,我想將這些字段保存在這個表中

    provider_id =  parent_success_obj.uid  
    provider_status = status 

和其他字段我正在使用 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)

編輯:

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

這是有效的,但我該如何編輯它

您需要將此數據發送到您使用此ProviderStatusSerilaizer的視圖。 有很多方法可以做到這一點。 其中之一是使用session 您可以像這樣在會話中存儲這些日期:

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

現在在您的提供程序序列化程序中,您可以通過 context發送請求對象

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

並覆蓋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)

僅供參考,請不要使用后綴 id(即<field_name>_id )命名 ForeignKey 字段,因為在下面,django 創建了帶有id后綴的字段。 因此,如果您將 FK 字段命名為abc ,django 將自動創建一個帶有abc_id的字段。

更新

如果您在同一視圖中獲取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