[英]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:并覆盖
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)
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
的字段。
If you are getting provider_id
and status
in same view, then you can pass that as context as well.如果您在同一视图中获取
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.