Python 根据请求设置foreignkey字段
我正在使用Django Rest框架3.2。我有一个模型“报告”,模型“办公室”的外键 我想根据请求设置Python 根据请求设置foreignkey字段,python,django,django-rest-framework,Python,Django,Django Rest Framework,我正在使用Django Rest框架3.2。我有一个模型“报告”,模型“办公室”的外键 我想根据请求设置report.office 我就是这样做的(我不喜欢,因为它需要复制): 在我看来,GET或POST/PUT/PATCH请求不同,其中GET使用嵌套的序列化程序表示,POST/PUT/PATCH使用平面序列化程序表示 然后我认为: def perform_create(self, serializer): serializer.save(office=Office.objects.ge
report.office
我就是这样做的(我不喜欢,因为它需要复制):
在我看来,GET或POST/PUT/PATCH请求不同,其中GET使用嵌套的序列化程序表示,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
很明显,这是一个重复,虽然它是工作,我不喜欢它。如果没有复制,验证(当然)会在调用模型的clean方法的
instance.clean()上失败。我真的需要这个,因为我的业务逻辑在模型的clean和save方法中。你能发布更多细节吗。我可以帮忙。为什么不使用管理器方法。将嵌套的序列化程序属性设置为只读,以便在编辑或创建新实例时不考虑这些属性。@seenus谢谢您的建议。这可能很好,但我不知道如何实现它。@dukebody嵌套的vs平面序列化程序不是问题->问题在于根据请求的信息设置foreignKey,而不是让用户提供这些信息。DRF教程中有一个关于将代码段作者设置为登录用户的示例。它通过将字段设置为只读并像您一样在perform_create方法中设置值来实现。这样模型验证就不会失败。