首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拥有嵌套可写序列化django drf的正确方法

拥有嵌套可写序列化django drf的正确方法
EN

Stack Overflow用户
提问于 2018-10-21 07:23:49
回答 1查看 199关注 0票数 0

总之,我有两个带有两个序列化器的模型,一个模型作为嵌套序列化器,如下所示:

代码语言:javascript
复制
class Item(models.Model):
  ...
  discounts = ManyToManyField(Discount)
  gift_discounts = ManyToManyField(GiftDiscount)
  ...

class Billing(models.Model):
  ...
  items = ManyToManyField(Item)
  ...

# serializers
class ItemSerializer(serializers.ModelSerializer):
  ...
  def create(self, validated_data):
    discounts = validated_data.pop('discounts')
    gift_discounts = validated_data.pop('gift_discounts')
    item = super(ItemSerializer, self).create(**validated_data)
    for discount in discounts:
      item.discounts.add(discount)
    for gift_discount in gift_discounts:
      item.gift_discounts.add(gift_discount)

class BillingSerializer(serializers.ModelSerializer):
  items = ItemSerializer(queryset=Item.objects.all(), many=True)
  ...
  def create(self, validated_data):
    items = validated_data.pop('items')
    billing = super(BillingSerializer, self).create(**validated_data)

    for item in items:
      discounts = item.pop('discounts')
      gift_discounts = item.pop('gift_discounts')

      sell_item = Item.objects.create(**item)

      for discount in discounts:
        sell_item.discounts.add(discount)

      for gift_discount in gift_discounts:
        sell_item.gift_discounts.add(gift_discount)

正如您可以看到的那样,对于这样的场景,我必须编写两次相同的代码,用于在项目序列化程序中创建项,在计费序列化程序中编写另一段代码,这违反了干规则,而且随着代码的发展,它可能变得更加复杂和容易出错。我正在寻找一种方法来编写这段代码,并在两处使用它。

也许在ItemSerializer中有一个类方法是一个解决方案,但不是一个完整的解决方案--您可能需要的ItemSerializer方法和成员不多,我认为最好的解决方案是创建一个序列化程序,不是使用原始数据,而是使用已验证的数据,因为在Billing创建方法中,我们有项的验证数据。

我使用django 1.11和DRF 3.8.2;

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-21 13:20:12

您也可以使用项序列化程序在BillingSerializer中创建项,如下所示:

代码语言:javascript
复制
class BillingSerializer(serializers.ModelSerializer):
  items = ItemSerializer(queryset=Item.objects.all(), many=True)
  ...
  def create(self, validated_data):
    items_validated_data = validated_data.pop('items')
    instance = super(BillingSerializer, self).create(validated_data)
    items = ItemSerializer(many=True).create(items_validated_data)

    instance.items.set(items)
    return billing
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52912990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档