首页 > 解决方案 > 如何在 Django REST Framework API 的 OneToOne 序列化器字段上允许空白字段?

问题描述

发布到我的 API 端点时,我在 OneToOne 字段上收到field is required错误,但我在我发布的模型的 save() 方法中创建了 OneToOne 字段。

我试过设置default=None,null=Trueblank=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." ]

标签: djangodjango-rest-framework

解决方案


将字段指定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',
        )

推荐阅读