Python Django-Tastypie-OneToOne关系帖子不';行不通

Python Django-Tastypie-OneToOne关系帖子不';行不通,python,django,tastypie,Python,Django,Tastypie,无论我做什么尝试,我总是会收到这个响应错误。这种方法似乎适用于多人关系,但在一人关系中却失败了。如果有人曾经遇到并解决过此问题,请提供帮助: 400 BAD REQUEST {"error": "The 'order' field has no data and doesn't allow a default or null value."} 调试试用: curl -X "POST" "http://localhost:5000/core/api/v1/order/" \ -H "Co

无论我做什么尝试,我总是会收到这个响应错误。这种方法似乎适用于多人关系,但在一人关系中却失败了。如果有人曾经遇到并解决过此问题,请提供帮助:

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

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
    )
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'
  • 尝试在Delivery Details中添加单独的主键“id”,因为我怀疑tastypie可能会失败,因为它无法在创建相关字段之前生成订单id
  • 已删除DeliveryDetails api中的订单字段,并尝试仅在订单资源中引用相关字段
  • 请求:

    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
        )
    
    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'
    
    型号:

    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
        )
    
    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'
    
    API:

    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
        )
    
    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字段不允许空值。因此,当时,您想要创建交货,但订单尚未创建,因此订单为空。可以先拆分订单请求,然后再进行交付,或者设置
    ToOneField
    属性
    null=True