【问题标题】:Django Rest - Posted data creating new rows in Foreign key referenced tablesDjango Rest - 发布数据在外键引用表中创建新行
【发布时间】: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 表中创建。但它也会在NurseryPlants 表中创建行
  • 那么我认为你需要使用serializers.PrimaryKeyRelatedField() 而不是PlantSerializer()。但是这样,当您检索订单时,您将只获得关系的 ID。因此,您需要将序列化程序分成两部分,1 用于读取,1 用于写入。
  • 只获取关系的ID就可以了,因为当我们将数据插入Order表时,我们会插入关系的ID。所以,在序列化器中,py 通过将 serializers.PrimaryKeyRelatedField()PlantSerializer() 更改,我们可以在不在引用表中插入新行的情况下发布数据
  • @SAISANTOSHCHIRAG 是的,对于您的最后一条评论,您只需要在帖子数据 Order 中提供关系的主键,不会创建关系的新实例。

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


【解决方案1】:

你可以这样做,

对不起,我不明白你想在哪里创建新行

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(read_only=True)
    # nursery = NurserySerializer()
    class Meta:
        model = Plants
        fields = ['name', 'price','image','nursery']


class OrderSerializer(serializers.ModelSerializer):
    user = serializers.SlugRelatedField(read_only=True,slug_field='username')
    product = PlantSerializer(read_only=True)
    nursery = NurserySerializer(read_only=True)

    class Meta:
        model = Order
        fields = ['user', 'product','date_ordered','order_id','is_purchased','cost','quantity','nursery']

【讨论】:

  • 现在可以使用了,谢谢。此外,此解决方案也可以使用。
  • 什么,我不知道,wkwkwk,我刚刚修复了你的代码
猜你喜欢
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
  • 2022-01-04
  • 1970-01-01
相关资源
最近更新 更多