django - 如何在 Django REST Framework API 的 OneToOne 序列化器字段上允许空白字段?
问题描述
发布到我的 API 端点时,我在 OneToOne 字段上收到field is required
错误,但我在我发布的模型的 save() 方法中创建了 OneToOne 字段。
我试过设置default=None
,null=True
和blank=True
设备型号
class Device(models.Model):
name = models.CharField(max_length=50)
created = models.DateTimeField(auto_now_add=True, editable=False)
last_updated = models.DateTimeField(auto_now=True, editable=False)
brand = models.TextField(max_length=50)
year_purchased = models.IntegerField()
serial_number = models.TextField(max_length=100)
info = models.TextField(max_length=100)
qrcode = models.ImageField(upload_to='', blank=True, null=True)
def save(self, **kwargs):
super(Device, self).save(**kwargs)
if not self.qrcode:
self.generate_qrcode()
if not self.checkouts.exists():
checkout = Checkout(item=self)
checkout.save()
结帐模型
class Checkout(models.Model):
status_choices = (...)
# Fields
slug = extension_fields.AutoSlugField(populate_from='item', blank=True)
created = models.DateTimeField(auto_now_add=True, editable=False)
last_updated = models.DateTimeField(auto_now=True, editable=False)
due_back = models.DateField(null=True, blank=True)
checked_out = models.DateTimeField(blank=True, null=True)
status = models.CharField(max_length=2, choices=status_choices, default=in_stock)
# Relationship Fields
user = models.OneToOneField(
DeviceUser,
on_delete=models.CASCADE,
related_name="checkouts",
blank=True,
null=True,
default=None,
)
item = models.OneToOneField(
Device,
on_delete=models.CASCADE,
related_name="checkouts",
primary_key=True,
blank=True,
default=None,
)
设备序列化器
class DeviceSerializer(serializers.ModelSerializer):
class Meta:
model = models.Device
fields = (
'pk',
'name',
'created',
'last_updated',
'brand',
'year_purchased',
'serial_number',
'info',
'checkouts',
)
发布时http POST http://localhost:8000/main/api/device/ brand=test2 info=123213123 name=test2 serial_number=12321321 year_purchased=12 'Authorization: Token .....'
我希望得到一个设备已创建的确认,而不是我得到
"checkouts": [ "This field is required." ]
解决方案
将字段指定checkouts
为您的DeviceSerializer
序列化程序,
checkouts = serializers.DateTimeField(default=None, source='checkouts.checked_out', read_only=True)
# code sample
class DeviceSerializer(serializers.ModelSerializer):
checkouts = serializers.DateTimeField(default=None, source='checkouts.checked_out', read_only=True)
class Meta:
model = models.Device
fields = (
'pk',
'name',
'created',
'last_updated',
'brand',
'year_purchased',
'serial_number',
'info',
'checkouts',
)
推荐阅读
- javascript - Web Animation,如何为背景 rgba 颜色设置动画
- react-hooks - 使用 UseEffect 调用端点
- php - 按销售分类产品 - woocommerce
- angular - canDeactivate 不适用于 Angular 材质模态窗口
- geometry - 如何找到屋顶三角形的坐标?
- sql - 有没有办法在不执行 hive SQL 的情况下获取 hive SQL 返回的字段和类型
- java - 从 unix 值获取前一小时/前一天的时间戳
- java - 我收到一个字符串数组,并希望根据数组中收到的字符串访问哈希图
- hibernate - @OneToOne 关系中的两个问题
- ruby-on-rails - 如何识别瓶颈并优化慢速测试套件?