【发布时间】:2019-03-25 00:59:18
【问题描述】:
我正在使用Django 2.x 和Django REST Framework。
我有一个带有contact 作为外键的模型
class AmountGiven(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
contact = models.ForeignKey(Contact, on_delete=models.PROTECT)
amount = models.FloatField(help_text='Amount given to the contact')
given_date = models.DateField(default=timezone.now)
created = models.DateTimeField(auto_now=True)
和类似的序列化器
class AmountGivenSerializer(serializers.ModelSerializer):
mode_of_payment = serializers.PrimaryKeyRelatedField(queryset=ModeOfPayment.objects.all())
contact_detail = ContactSerializer(source='contact', read_only=True)
contact = serializers.PrimaryKeyRelatedField(queryset=Contact.objects.all())
class Meta:
model = AmountGiven
depth = 1
fields = (
'id', 'contact', 'contact_detail', 'amount', 'given_date', 'created'
)
创建新记录时需要contact 字段。但我不希望 contact 在创建后被修改。
但是当我使用PUT 方法只发送amount 时,它会说
{
"contact": [
"This field is required."
]
}
当我使用PATCH 方法时,它工作正常,但如果为contact 传递一些其他值,它也会更新contact。
我想在更新现有记录时创建contact 字段not-required。而且就算通过了,也不要设置新的数据,而是使用之前的那个。
试用 2
我尝试将请求中的 contact 字段覆盖为先前存储的值,以便如果更改 contact 被传递或没有 contact 被传递,它将保存较早的值。
所以,在视图集中添加函数
def update(self, request, *args, **kwargs):
obj = self.get_object()
request.data['contact'] = obj.contact_id
return super().update(request, *args, **kwargs)
但这会导致错误
This QueryDict instance is immutable
【问题讨论】:
-
更新时需要设置为只读。
标签: django django-rest-framework