【问题标题】:Django Serializer for post with related fields用于发布相关字段的 Django 序列化程序
【发布时间】:2020-09-30 19:50:01
【问题描述】:

我有以下模型和序列化器:

class Order(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='orders')
    orderType = models.IntegerField()
    justification = models.CharField("Order justification", max_length=150, default=None, blank=True, null=True)
    date = models.DateTimeField("Order date")
    
    status = OrderType()

class Item(models.Model):
    order = models.ForeignKey(Order, on_delete=models.CASCADE, related_name='items')
    product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='itemsProduct')
    quantity = models.IntegerField("Quantity sale")
    price = models.DecimalField("Sale price", max_digits=15, decimal_places=2)


class OrderItemSerializer(serializers.ModelSerializer):

    items = ItemSerializer()

    class Meta:
        model = Order
        depth = 0
        fields = ["user", "orderType", "justification", "date", "items"]

我想用这样的 json 实现一个帖子:

{
  "user": 10,
  "orderType": 1,
  "justification": "",
  "date": "2020-09-30T19:11:55.327Z",
  "items": [{
    "quantity": 1,
    "price": 1,
    "order": (need to be the order that i'm posting)
    "product": 1
  },
  {
    "quantity": 1,
    "price": 12,
    "order": (need to be the order that i'm posting)
    "product": 3
  }]
}

但是使用我的序列化器,帖子是:

{
  "user": 10,
  "orderType": 1,
  "justification": "",
  "date": "2020-09-30T19:11:55.327Z",
  "items":{
    "quantity": 1,
    "price": 1,
    "order": 0,
    "product": 1
  }
}

是否有办法为帖子插入许多项目并自动设置 item.order 字段(如第一个 json)做一个序列化程序?

#编辑 1

为了更清楚在“many=True”的解决方案之后我需要什么...... 目前,如果我想发布一个订单和一个项目,我需要先用这样的 json 发布一个订单:

{
  "user": 10,
  "orderType": 1,
  "justification": "",
  "date": "2020-09-30T19:11:55.327Z"
}

然后我需要用这样的 json 为项目发布一个帖子:

{
    "quantity": 1,
    "price": 1,
    "order": 1,
    "product": 1
}

其中“订单”字段是 django 自动生成并在我的示例中的第一个帖子之后返回的订单的 pk。

如果我事先不知道 Ordem 的主键,我如何仅使用一个包含许多项的 Ordem 序列化程序来发布帖子? 我相信在我的序列化程序中我需要覆盖“创建”来为我的项目设置订单主键,但我不知道如何。

基本上,我需要我的帖子使用以下 json(项目中没有“订单”字段,因为该值是在订单创建中为 django 生成的):

{
  "user": 10,
  "orderType": 1,
  "justification": "",
  "date": "2020-09-30T19:11:55.327Z",
  "items": [{
    "quantity": 1,
    "price": 1,
    "product": 1
  },
  {
    "quantity": 1,
    "price": 12,
    "product": 3
  }]
}

【问题讨论】:

    标签: django django-rest-framework django-views django-serializer


    【解决方案1】:

    将 many=True 添加到 items = ItemSerializer() 行:

    items = ItemSerializer(many=True)
    

    【讨论】:

    • 嗨。 Tkns 的解决方案。这适用于显示所有项目。你知道这个序列化程序的帖子如何自动为我的订单中的所有项目设置 items.order 吗?该帖子期望以下json,在项目中需要订单ID(我只在订单发布后才知道订单ID)``` {“user”:0,“orderType”:0,“justification”:“string”, “日期”:“2020-10-04T19:37:49.713Z”,“项目”:{“数量”:0,“价格”:0,“订单”:0,“产品”:0 } } ```
    • 只需将 pk 添加到您的 api 视图中。例如,如果您的 api 视图类似于: /api/orders_items_view/ 您应该转到 /api/orders_items_view/3 其中“3”是订单的 pk
    • 嗨。我觉得我不够清楚。顺便说一句,对不起我的英语。我对示例进行了更好的编辑,我的意思是只用一个序列化程序发帖。我不知道您的解决方案是否可行,因为我没有订单的 pk 来发出发布请求。 (django只有在订单发布后才会自动生成pk)
    猜你喜欢
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    相关资源
    最近更新 更多