【发布时间】:2021-04-11 00:13:08
【问题描述】:
我正在尝试将数据发布到我的订单模型。它有几个外键。当我尝试发布数据时,它也在尝试在引用的模型中创建对象。 我的models.py:
from django.db import models
from django.contrib.auth.models import User
from accounts.models import Profile
class Nursery(models.Model):
name = models.CharField(max_length=30,unique=True)
state = models.CharField(max_length=40)
city = models.CharField(max_length=40)
profile = models.OneToOneField(Profile,on_delete=models.CASCADE)
class Plants(models.Model):
name = models.CharField(max_length=30,unique=True)
image = models.ImageField(upload_to='static/plants')
price = models.IntegerField()
nursery = models.ForeignKey(Nursery,on_delete=models.CASCADE)
class Order(models.Model):
user = models.ForeignKey(User,on_delete=models.CASCADE)
product = models.ForeignKey(Plants,on_delete=models.CASCADE)
date_ordered = models.DateTimeField(auto_now=True)
order_id = models.UUIDField(auto_created=True)
is_purchased = models.BooleanField(default=False)
cost = models.IntegerField()
quantity = models.IntegerField()
nursery = models.ForeignKey(Nursery,on_delete=models.CASCADE)
所以,我尝试将数据发布到 Order 模型中,但它给出了错误 Plant name already exists,这意味着它也在尝试在 Plants 和 Nursery 模型中创建一行。
我的 serializers.py:
from .models import Plants,Order,Nursery
from rest_framework import serializers
class NurserySerializer(serializers.ModelSerializer):
class Meta:
model = Nursery
fields = "__all__"
class PlantSerializer(serializers.ModelSerializer):
nursery = NurserySerializer()
# nursery = NurserySerializer()
class Meta:
model = Plants
fields = ['name', 'price','image','nursery']
class OrderSerializer(serializers.ModelSerializer):
user_name = serializers.CharField(source='user.username', read_only=True)
product = PlantSerializer()
nursery = serializers.CharField(source='nursery.name', read_only=True)
class Meta:
model = Order
fields = ['user_name', 'product','date_ordered','order_id','is_purchased','cost','quantity','nursery']
Views.py:
class PostOrder(APIView):
def post(self, request, format=None):
print(request.data)
serializer = OrderSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
【问题讨论】:
-
This thread 可能会有所帮助。我在我的项目中使用drf-writable-nested,它真的很有帮助。
-
@HarunYilmaz 在您提供的线程中,它也会在引用的表中创建一行。我不想那样做。也就是说,发布的数据应该只在
Order表中创建。但它也会在Nursery和Plants表中创建行 -
那么我认为你需要使用
serializers.PrimaryKeyRelatedField()而不是PlantSerializer()。但是这样,当您检索订单时,您将只获得关系的 ID。因此,您需要将序列化程序分成两部分,1 用于读取,1 用于写入。 -
只获取关系的ID就可以了,因为当我们将数据插入Order表时,我们会插入关系的ID。所以,在序列化器中,py 通过将
serializers.PrimaryKeyRelatedField()从PlantSerializer()更改,我们可以在不在引用表中插入新行的情况下发布数据 -
@SAISANTOSHCHIRAG 是的,对于您的最后一条评论,您只需要在帖子数据 Order 中提供关系的主键,不会创建关系的新实例。
标签: django rest django-models django-rest-framework django-views