我想做的是设置我的序列化程序或视图,以便我的订单发布方法接受:
{
"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 的示例。我试图弄清楚我是否可以更多地了解我的订单序列化程序类上的创建方法正在做什么。
在你的
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:
...
在序列化器中很常见,没什么好害怕的。