简体   繁体   English

Django Tastypie-OneToOne关系POST不起作用

[英]Django Tastypie - OneToOne Relationship POST doesn't work

I keep getting this response error no matter what I try. 无论我如何尝试,我都会不断收到此响应错误。 The method seems to work perfectly for ManyToOne Relationships however fails in OneToOne. 该方法似乎可用于ManyToOne关系,但是在OneToOne中失败。 Please help if anyone has encountered and solved this before: 如果有人遇到过并解决了此问题,请提供帮助:

400 BAD REQUEST
{"error": "The 'order' field has no data and doesn't allow a default or null value."}

Debugging trials: 调试试用:

  1. Tried adding a separate primary key "id" in Delivery Details as I suspected that tastypie might be failing because it is not able to generate Order id before it creates the related fields. 尝试在“传递详细信息”中添加一个单独的主键“ id”,因为我怀疑好吃的东西可能会失败,因为它无法在创建相关字段之前生成订单ID。
  2. Removed the order field in the DeliveryDetails api and tried to reference the related field only in the Order Resource. 删除了DeliveryDetails api中的订单字段,并尝试仅在订单资源中引用相关字段。

Request: 请求:

curl -X "POST" "http://localhost:5000/core/api/v1/order/" \
    -H "Content-Type: application/json" \
    -d "{\"source\":\"W\",\"delivery_detail\":{\"email\":\"valery.flemister@yam.com\"}}"

Models: 楷模:

class Order(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    created_at = models.DateTimeField(
        verbose_name='created at',
        auto_now_add=True
    )
    updated_at = models.DateTimeField(
        verbose_name='updated at',
        auto_now=True
    )
    SOURCE_TYPES = (
        ('I', 'iOS'),
        ('A', 'Android'),
        ('W', 'Web'),
        ('N', 'Not Applicable')
    )
    source = models.CharField(
        verbose_name='order source',
        max_length=1,
        choices=SOURCE_TYPES,
        default='N'
    )
class DeliveryDetail(models.Model):
    order = models.OneToOneField(
        to=Order,
        primary_key=True
    )
    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        blank=True,
        null=True
    )

API: API:

class OrderResource(ModelResource):
    delivery_detail = fields.ToOneField(
        to='core.api.v1_order.DeliveryDetailResource',
        attribute='deliverydetail',
        related_name='order',
        help_text='Delivery details',
        full=True
    )

    class Meta:
        queryset = Order.objects.all()
        resource_name = 'order'
class DeliveryDetailResource(ModelResource):
    order = fields.ToOneField(
        to=OrderResource,
        attribute='order'
    )

    class Meta:
        queryset = DeliveryDetail.objects.all()
        resource_name = 'delivery_detail'

OneToOne Fields don't allow null values. OneToOne字段不允许使用空值。 So at the time, you want to create your Delivery, the order hasn't been created yet, so the order is null. 因此,当时您要创建交货,但尚未创建订单,因此订单为空。 Either split the request for Order first and then Delivery, or set the ToOneField attribute null=True 请先拆分对订单的请求,然后再拆分交付,或者将ToOneField属性设置为null=True

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM