我正在使用Django Rest Framework 3.2。我有一个带有ForeignKey的模型“Report”到模型“Office”。
我想根据请求设置report.office
。
我就是这样做的(我不喜欢,因为它需要重复):
在我看来,我在GET或POST / PUT / PATCH请求之间有所区别,其中GET使用嵌套的Serializer表示,而POST / PUT / PATCH使用平面序列化表示。
然后我认为:
def perform_create(self, serializer):
serializer.save(office=Office.objects.get_only_one_from_request(self.request))
并在我的FlatOfficeSerializer中:
def validate(self, attrs):
if self.instance is not None:
instance = self.instance
instance_fields = instance._meta.local_fields
for f in instance_fields:
f = self.get_initial().get(f.name)
else:
instance = self.Meta.model(**attrs)
request = self.context.get('request')
instance.office = Office.objects.get_only_one_from_request(request)
instance.clean()
return attrs
很明显,那里有一个重复,虽然它有效但我不喜欢它。如果没有重复,验证将失败(当然)instance.clean()
,它会调用模型的clean方法。我真的需要这个,因为我的业务逻辑在模型的清理和保存方法中。