[英]Django Rest Framework I can't use Serializer save model of have foreign key
[英]Django/Django Rest Framework - How do I allow model serializer to set model's foreign key field to null?
我希望能夠在我的Asset
模型中將borrower
字段(外鍵)設置為NULL
但似乎無法使其正常工作。 我正在嘗試使用具有密鑰borrower
等於NULL
值的JSON數據發送PATCH請求,但是對於模型實例, borrower
字段不會更新為NULL
。 也許序列化程序存在一個問題,即無法將外鍵字段設置為NULL
?
我已經嘗試過將allow_null=True
傳遞給BorrowSerializer
類,但這沒有用。 我已經在StackOverflow的高處和低處搜索了具有類似問題和解決方案的帖子,但我嘗試過的任何方法都沒有奏效。
這是我的models.py:
from django.conf import settings
from django.db import models
from django.utils import timezone
from datetime import date
from django.contrib.auth.models import User
from django.urls import reverse
import uuid
class Category(models.Model):
"""Model representing an Asset category"""
name = models.CharField(max_length=128)
def __str__(self):
return self.name
class Borrower(models.Model):
first_name = models.CharField(max_length=64)
last_name = models.CharField(max_length=128)
associated_user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
def __str__(self):
return f'{self.first_name} {self.last_name}'
class Asset(models.Model):
"""Model representing an Asset"""
# Unique identifier for an instance of an asset (a barcode of sorts)
uid = models.UUIDField(primary_key=True, default=uuid.uuid4)
name = models.CharField(max_length=200)
manufacturer = models.CharField(max_length=64)
model = models.CharField(max_length=128)
description = models.TextField()
category = models.ManyToManyField(Category)
owner = models.ForeignKey(User, on_delete=models.CASCADE)
borrower = models.ForeignKey(Borrower, on_delete=models.CASCADE, null=True, blank=True)
checked_out = models.BooleanField(default=False)
return_date = models.DateField(null=True, blank=True)
CONDITION_TYPE = (
('e', 'Excellent'),
('g', 'Good'),
('f', 'Fair'),
('p', 'Poor'),
)
condition = models.CharField(
max_length=1,
choices=CONDITION_TYPE,
blank=True,
help_text='Asset condition')
class Meta:
ordering = ['return_date']
@property
def is_dueback(self):
if self.return_date and date.today() > self.return_date:
return True
return False
def display_category(self):
"""Create a string for the Category. This is required to display category in Admin."""
return ', '.join(category.name for category in self.category.all())
display_category.short_description = 'Category'
def __str__(self):
return f'{self.uid} - {self.name}'
def get_absolute_url(self):
return reverse('asset-detail', args=[str(self.uid)])
這是我的serializers.py文件:
from rest_framework import serializers
from inventory.models import Asset, Borrower, Category
class BorrowerSerializer(serializers.ModelSerializer):
class Meta:
model = Borrower
fields = ('first_name',
'last_name',
'associated_user'
)
def update(self, instance, validated_data):
print('Update method triggered.')
instance.first_name = validated_data.get('first_name', instance.first_name)
instance.last_name = validated_data.get('last_name', instance.last_name)
instance.associated_user = validated_data.get('associated_user'. instance.associated_user)
instance.save()
return instance
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = '__all__'
class AssetSerializer(serializers.ModelSerializer):
borrower = BorrowerSerializer(allow_null=True)
category = serializers.StringRelatedField(many=True)
condition = serializers.CharField(source='get_condition_display')
class Meta:
model = Asset
fields = ('name',
'manufacturer',
'model',
'description',
'condition',
'category',
'borrower',
'checked_out',
'return_date',
'is_dueback',
)
這是我的DRF API視圖:
class AssetRetrieveUpdateDestroy(RetrieveUpdateDestroyAPIView):
lookup_field = 'uid'
serializer_class = AssetSerializer
def get_queryset(self):
user = self.request.user
return Asset.objects.filter(owner=user)
class BorrowerRetrieveUpdateDestroy(RetrieveUpdateDestroyAPIView):
lookup_field = 'id'
serializer_class = BorrowerSerializer
def get_queryset(self):
return Borrower.objects.all()
當我傳遞此JSON時,我希望我的Asset
模型實例中的borrower
字段更新為NULL:
data = {
'borrower': null
}
但是,我的模型實例是外鍵時,不會更新borrower
字段。 如果該字段是CharField
或其他名稱,但在外鍵上,則可以正常工作。 我打印了從我的AJAX請求返回的數據,但borrower
字段保持不變。
預先感謝您提供的任何幫助。
從文檔 :
如果您支持可寫的嵌套表示形式,則需要編寫用於保存多個對象的
.create()
或.update()
方法。
因此,你需要實現.update()
在你的方法AssetSerializer
:
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
這應該做的工作。 因此,無論您傳遞了allow_null=True
,它都將接受null值 ,但是除非您定義自定義更新機制,否則它不會更新嵌套關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.