Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据请求设置foreignkey字段_Python_Django_Django Rest Framework - Fatal编程技术网

Python 根据请求设置foreignkey字段

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

我正在使用Django Rest框架3.2。我有一个模型“报告”,模型“办公室”的外键

我想根据请求设置
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方法中设置值来实现。这样模型验证就不会失败。