[英]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()
并覆盖ProviderStatusSerilaizer
的create
方法以利用请求对象:
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_id
和status
,那么您也可以将其作为上下文传递。
# 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.