Django Rest Framework 序列化器关系

问题描述 投票:0回答:1

我想做的是设置我的序列化程序或视图,以便我的订单发布方法接受:

    {
        "user_id": 1,
        "ordered_items": [
            {
                "item_id": 1,
                "quantity": 1
            }
        ]
    }

from django.db import models
from user.models import User

class Item(models.Model):
  name = models.CharField(max_length=50)
  price = models.DecimalField(max_digits=8, decimal_places=2)

class Order(models.Model):
  items = models.ManyToManyField(Item, through='OrderedItem')
  created_at = models.DateTimeField(auto_now_add=True)
  user = models.ForeignKey(User, related_name='order', on_delete=models.CASCADE)

class OrderedItem(models.Model):
  order = models.ForeignKey(Order, related_name='ordered_items', on_delete=models.CASCADE)
  item = models.ForeignKey(Item, related_name='ordered', on_delete=models.CASCADE)
  quantity = models.PositiveIntegerField()
from rest_framework import serializers
from .models import Item, Order, OrderedItem

class ItemSerializer(serializers.ModelSerializer):
  class Meta:
    model = Item
    fields = '__all__'

class OrderedItemSerializer(serializers.ModelSerializer):

  class Meta:
    model = OrderedItem
    fields = ('item_id', 'quantity', 'id')

class OrderSerializer(serializers.ModelSerializer):
  ordered_items = OrderedItemSerializer(many=True)

  class Meta:
    model = Order
    fields = ('id', 'created_at', 'user_id', 'ordered_items')

  def create(self, validated_data):
    ordered_items_data = validated_data.pop('ordered_items')
    order = Order.objects.create(**validated_data)

    for ordered_item_data in ordered_items_data:
      OrderedItem.objects.create(order=order, **ordered_item_data)
    return order
from rest_framework import viewsets
from .models import Item, Order
from .serializers import ItemSerializer, OrderSerializer

class ItemViewSet(viewsets.ModelViewSet):
  queryset = Item.objects.all()
  serializer_class = ItemSerializer

class OrderViewSet(viewsets.ModelViewSet):
  queryset = Order.objects.all()
  serializer_class = OrderSerializer

如果有人能告诉我我可能会做些什么来完成这项工作,或者将我带到一个我可能会找到答案的地方,我将非常感激!

我收到这个错误:

关系“store_order”的“user_id”列中的空值违反了非空约束详细信息:失败行包含 (8, 2023-04-05 12:29:32.034365+00, null)

我已经坚持了大约一个星期,并一直在寻找我可以阅读的内容或类似 API 的示例。我试图弄清楚我是否可以更多地了解我的订单序列化程序类上的创建方法正在做什么。

python django-models django-rest-framework django-views django-serializer
1个回答
0
投票

在你的

store/vews.py
中你有:

serializer.save(user_id=request.id)

应该是:

serializer.save(user_id=request.user.id)

Django 的

request.user
持有当前经过身份验证的用户模型。

您也可以直接在序列化程序中设置它,以避免将您的逻辑分散到多个文件中。有关示例,请参见this answer。您的方法没有错,它使您的序列化程序保持“纯净”,但需要您在每个视图(设置)中添加用户设置代码。

使用:

request = self.context.get('request', None)
if request:
   ...

在序列化器中很常见,没什么好害怕的。

© www.soinside.com 2019 - 2024. All rights reserved.