【问题标题】:Serialize related models and override the create method序列化相关模型并覆盖create方法
【发布时间】:2017-07-11 10:07:39
【问题描述】:

我是 DRF 的新手,我想做一些类似于 django 表单中的表单集的事情 我有一个InvoiceProducts 彼此相关的模型抛出多对多InvoiceDetail 模型.. 当我创建发票时,我选择一些产品并为每个产品创建一个InvoiceDetail 对象.. 我想做这在 DRF 中如何序列化 Invoice 模型并创建函数呢? 还是我应该这样做?

models.py:

 class Invoices(models.Model):
     #some fields
     products = models.ManyToManyField('Products', through='InvoiceDetail')


class Products(models.Model):
    #some fields


class InvoiceDetail(models.Model):
    invoice = models.ForeignKey(Invoices, related_name='parent_invoice')
    product = models.ForeignKey(Products, related_name='parent_product')
    product_description = models.TextField()
    product_price = models.DecimalField(max_digits=9, decimal_places=2)
    quantity_sold = models.IntegerField()

serializers.py:

class ProductsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Products
        fields = ('barcode', 'product_code', 'name', 'description', 'category',
                  'quantity_in_stock', 'quantity_on_hold', 'expire_date',
                  'vendor', 'manufacturer', 'discount')


class InvoiceDetailsSerializer(serializers.ModelSerializer):
    class Meta:
        model = InvoiceDetail
        fields = '__all__'

view.py:

class ProductsView(viewsets.ReadOnlyModelViewSet):
    queryset = Products.objects
    serializer_class = ProductsSerializer


class InvoicesView(viewsets.ModelViewSet):
    queryset = Invoices.objects
    serializer_class = InvoicesSerializer



class InvoiceDetailView(viewsets.ModelViewSet):
    queryset = InvoiceDetail.objects
    serializer_class = InvoiceDetailsSerializer

【问题讨论】:

标签: python django django-rest-framework


【解决方案1】:

您可以在序列化程序本身中执行此操作,

class InvoiceSerializer(serializers.ModelSerializer):
    products = serializers.PrimaryKeyRelatedField(queryset=Product.objects.all(), many=True)
    class Meta:
        model = Invoice
        fields = [ f.name for f in model._meta.fields ] + ['products']

    def create(self, validated_data):
        products = validated_data.pop('products')
        invoice = super(InvoiceSerializer, self).create(validated_data)
        for product in products:
            InvoiceDetail.objects.create(invoice=invoice, product=product)
        return invoice

这只是一个了解其工作原理的基本示例。您可以根据需要对其进行自定义。

【讨论】:

  • 我收到此错误<django.db.models.fields.related_descriptors.create_forward_many_to_many_manager.<locals>.ManyRelatedManager object at 0x7f2e367dcd30> is not JSON serializable,我怎样才能使用这种方式从客户那里获得销售数量?
  • 您只需在产品字段中添加many=True。我完全忘记了。
  • 编辑了我的答案。
猜你喜欢
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多