Python Django/Django Rest框架-如何允许模型序列化程序设置模型';s外键字段是否为空?

Python Django/Django Rest框架-如何允许模型序列化程序设置模型';s外键字段是否为空?,python,django,django-rest-framework,Python,Django,Django Rest Framework,我希望能够将我的资产模型中的借款人字段(外键)设置为空,但我似乎无法让它工作。我正在尝试发送一个带有JSON数据的补丁请求,该数据的键fower等于NULL的值,但是模型实例的fower字段不会更新为NULL。序列化程序可能存在问题,无法将外键字段设置为NULL 我已经尝试将allow\u null=True传递到BorrowSerializer类,但没有成功。我在StackOverflow上到处搜索有类似问题和解决方案的帖子,但我尝试过的都没有成功 这是我的models.py: 来自djang

我希望能够将我的
资产
模型中的
借款人
字段(外键)设置为
,但我似乎无法让它工作。我正在尝试发送一个带有JSON数据的补丁请求,该数据的键
fower
等于
NULL
的值,但是模型实例的
fower
字段不会更新为
NULL
。序列化程序可能存在问题,无法将外键字段设置为
NULL

我已经尝试将
allow\u null=True
传递到
BorrowSerializer
类,但没有成功。我在StackOverflow上到处搜索有类似问题和解决方案的帖子,但我尝试过的都没有成功

这是我的models.py:

来自django.conf导入设置的

从django.db导入模型
从django.utils导入时区
起始日期时间导入日期
从django.contrib.auth.models导入用户
从django.url反向导入
导入uuid
类别(models.Model):
“”“表示资产类别的模型”“”
name=models.CharField(最大长度=128)
定义(自我):
返回self.name
类别借款人(models.Model):
first_name=models.CharField(最大长度=64)
last_name=models.CharField(最大长度=128)
关联的\u user=models.ForeignKey(用户,在\u delete=models.CASCADE上,null=True)
定义(自我):
返回f'{self.first_name}{self.last_name}'
类别资产(models.Model):
“”“表示资产的模型”“”
#资产实例的唯一标识符(分类条形码)
uid=models.UUIDField(主键=True,默认值=uuid.uuid4)
name=models.CharField(最大长度=200)
制造商=型号.CharField(最大长度=64)
model=models.CharField(最大长度=128)
description=models.TextField()
类别=模型。多个多个字段(类别)
owner=models.ForeignKey(用户,on_delete=models.CASCADE)
借用者=模型.ForeignKey(借用者,on_delete=models.CASCADE,null=True,blank=True)
checked_out=models.BooleanField(默认值=False)
return\u date=models.DateField(null=True,blank=True)
条件类型=(
(‘e’,‘极好’),
('g','Good'),
(‘f’、‘Fair’),
(‘p’、‘Poor’),
)
条件=models.CharField(
最大长度=1,
选项=条件类型,
空白=真,
帮助(text='Asset condition')
类元:
订购=[“退货日期”]
@财产
def返回(自身):
如果self.return\u日期和date.today()>self.return\u日期:
返回真值
返回错误
def显示_类别(自身):
“”“为类别创建字符串。这是在管理中显示类别所必需的。”“”
返回“,”.join(self.category.all()中category的category.name)
显示\u category.short\u说明='category'
定义(自我):
返回f'{self.uid}-{self.name}'
def get_绝对_url(自身):
返回反向('asset-detail',args=[str(self.uid)])
这是我的serializers.py文件:

从rest\u框架导入序列化程序
从inventory.models导入资产、借款人、类别
类借用器序列化程序(序列化程序.ModelSerializer):
类元:
模型=借款人
字段=('first_name',
“姓”,
“关联用户”
)
def更新(自身、实例、已验证的_数据):
打印('已触发更新方法')
instance.first\u name=validated\u data.get('first\u name',instance.first\u name)
instance.last\u name=validated\u data.get('last\u name',instance.last\u name)
instance.associated_user=已验证的_数据.get('associated_user'。instance.associated_user)
save()实例
返回实例
类CategorySerializer(serializers.ModelSerializer):
类元:
型号=类别
字段='\uuuu所有\uuuu'
类AssetSerializer(serializers.ModelSerializer):
借用者=借用者序列化器(允许为空=真)
category=serializers.StringRelatedField(many=True)
condition=serializers.CharField(source='get\u condition\u display')
类元:
模型=资产
字段=('name',
“制造商”,
“模型”,
“说明”,
“条件”,
“类别”,
“借款人”,
“签出”,
“返回日期”,
“你是杜贝克吗?”,
)
以下是我的DRF API视图:

class AssetRetrieveUpdateDestroy(RetrieveUpdateDestroyAPIView):
查找\u字段='uid'
序列化程序_class=AssetSerializer
def get_queryset(自我):
user=self.request.user
返回Asset.objects.filter(所有者=用户)
类借用ErretrieveUpdatedStroy(RetrieveUpdatedStroyApiView):
查找\u字段='id'
序列化程序\u类=借用器序列化程序
def get_queryset(自我):
返回follower.objects.all()
当我传入此JSON时,我希望我的
资产
模型实例中的
借款人
字段更新为空:

data = {
   'borrower': null
}
但是,当我的模型实例是外键时,它不会更新
forrower
字段。如果字段是
CharField
或其他内容,但在外键上,则可以正常工作。我打印了从AJAX请求返回的数据,但是
forrower
字段保持不变

提前感谢您提供的任何帮助。

来自:

如果支持可写嵌套表示,则需要编写处理保存多个对象的
.create()
.update()
方法

因此,您需要在
AssetSerializer
中实现
.update()
方法:

class AssetSerializer(serializers.ModelSerializer):
    borrower = BorrowerSerializer(allow_null=True)
    ...

    class Meta:
        model = Asset
        fields = (...)

    def update(self, instance, validated_data):
        instance.borrower = validated_data.get('borrower')
        instance.save()

        return instance
这应该可以完成工作。所以不管你通过了考试