【问题标题】:Django Tastypie - OneToOne Relationship POST doesn't workDjango Tastypie - OneToOne 关系 POST 不起作用
【发布时间】:2015-10-14 17:42:18
【问题描述】:

无论我尝试什么,我都会不断收到此响应错误。该方法似乎非常适用于多对一关系,但在 OneToOne 中失败。如果有人遇到过并解决过这个问题,请帮忙:

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

调试试验:

  1. 尝试在 Delivery Details 中添加一个单独的主键“id”,因为我怀疑 sweetpie 可能会失败,因为它无法在创建相关字段之前生成 Order id。
  2. 删除 DeliveryDetails api 中的 order 字段,并尝试仅在 Order Resource 中引用相关字段。

请求:

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\"}}"

型号:

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:

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'

【问题讨论】:

    标签: python django tastypie


    【解决方案1】:

    OneToOne 字段不允许空值。所以当时,你想创建你的Delivery,订单还没有创建,所以订单是空的。要么先拆分对 Order 的请求,然后再拆分 Delivery,或者设置 ToOneField 属性 null=True

    【讨论】:

      猜你喜欢
      • 2012-10-04
      • 2019-04-18
      • 2015-01-19
      • 1970-01-01
      • 2018-10-01
      • 2021-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-29
      相关资源
      最近更新 更多