代码之家  ›  专栏  ›  技术社区  ›  ChampR

在框架中创建模型实例之前操作序列化程序上的数据

  •  1
  • ChampR  · 技术社区  · 6 年前

    订单模型

    class Order(models.Model):
        id = models.UUIDField(primary_key=True, default=uuid.uuid4)
        Name  =  models.CharField(max_length=250)
        orderType = models.ForeignKey(OrderType, on_delete=models.CASCADE, null=True)
    
        class Meta:
            ordering = ['id']
        def __str__(self):
            return '{}'.format(self.Name)enter code here
    

    订单定价模型

    class OrderPricing(models.Model):
        id = models.UUIDField(primary_key=True, default=uuid.uuid4)
        TotalPrice =  models.DecimalField(decimal_places=2, max_digits=10)
        #related field
        order = models.ForeignKey(Order, on_delete=models.CASCADE, null=True)
    
        class Meta:
            ordering = ['order']
        def __str__(self):
            return self.TotalPrice
    

    订单类型模型

    class OrderType(models.Model):
        id = models.UUIDField(primary_key=True, default=uuid.uuid4)
        Name = models.CharField(max_length = 100)
        Premium =  models.BooleanField()
    
        class Meta:
            ordering = ['id']
    
    1. 让我们忽略上面模型出现的顺序。

    问题1:

    我可以从浏览器中创建一个订单。

    我还没有接触到“可写嵌套序列化程序”,我相信Django已经通过drf可写嵌套类在他们的文档中找到了这个方法。

    我有两种订单类型

    1={'Not Premium':'False'}非Premium

    = 5 #5

    1. 创建订单,
    2. 如果订单是优质的,则将订单价格设置为10#订单价格*2
    3. 如果订单不是特价,则将订单价格设置为5
    4. 创建与订单相关的OrderPricing实例。另外,通过 订单价格 属性的变量 创建实例时

    根据我所看到和尝试的,我可以重写序列化程序上的Create()

    class OrderSerializer(WritableNestedModelSerializer):
        """OrderSerializer"""
        # orderPricing = OrderPricingSerializer(required=False)
    
        class Meta:
            model = Order
            fields = ('__all__')
    
        def create(self, validated_data):
            #create instance of order
            #determine of order is premium
            typeid = uuid.UUID(validated_data.pop('orderType'))#get FK value
            isPremium = OrderType.objects.get(id = str(typeid.id))#determine if **Premium** is True/False
    
            # set/calculate the price of the order
            #create a related instance of OrderPricing
    

    我知道GenericViews和CreateModelMixin,但不知道哪一个更好,在序列化程序中重写.create(),在GenericView中重写CreateModelMixin方法

    1 回复  |  直到 6 年前
        1
  •  2
  •   Enthusiast Martin    6 年前

    您可以在多个地方使用它—视图、序列化程序、模型或其他一些单独的模块/服务。

    但对你来说,我可能会同意 perform_create 我会在序列化程序中创建一个方法来更新价格。如果我需要使用代码来更新price,我会移动到单独的共享模块并从那里调用它。

    假设你用 CreateModelMixin ListCreateAPIView

    class YourView(ListCreateAPIView):
        serializer = OrderSerializer
        queryset = your_queryset
    
        def perform_create(self, serializer):
             serializer.update_price()
             serializer.save()
    

    执行创建 在验证数据后调用,以便您可以访问验证的数据。

    update_price

    您可以主张将此逻辑移到序列化程序的create或save方法中,但它们会执行许多其他操作,因此,除非您出于其他原因需要重写这些方法,否则您可以利用 执行创建 方法。

    推荐文章