如何使嵌套序列化程序以给定方式表示数据?

How to make nested serializers represent data in given way?

型号:

class Category(models.Model):
    name       = models.CharField(max_length=80)
    created_at = models.DateTimeField(auto_now_add = True, null = True)
    created_by = models.ForeignKey(User, default = None, blank=True, null=True, on_delete=models.DO_NOTHING, related_name="created_by")
    updated_at = models.DateTimeField(auto_now = True, null = True)
    updated_by = models.ForeignKey(User, default = None, blank=True, null=True, on_delete=models.DO_NOTHING, related_name="updated_by")
    deleted_at = models.DateTimeField(null = True)
    deleted_by = models.ForeignKey(User, default = None, blank=True, null=True, on_delete=models.DO_NOTHING, related_name='deleted_by')
    
    
    class Meta:
        verbose_name_plural = "Categories"

    def __str__(self):
        return self.name

class Product(models.Model):
    category = models.ManyToManyField(Category, blank=False)
    name = models.CharField(max_length=100)
    description = models.TextField(max_length=250)
    price = models.DecimalField(max_digits=6, decimal_places=2)
    quantity = models.IntegerField(default=0)
    created_at = models.DateTimeField(auto_now_add = True, null = True)
    created_by = models.ForeignKey(User, default = None, blank=True, null=True, on_delete=models.DO_NOTHING, related_name="products_created_by")
    updated_at = models.DateTimeField(auto_now = True, null = True)
    updated_by = models.ForeignKey(User, default = None, blank=True, null=True, on_delete=models.DO_NOTHING, related_name="products_updated_by")
    deleted_at = models.DateTimeField(null = True)
    deleted_by = models.ForeignKey(User, default = None, blank=True, null=True, on_delete=models.DO_NOTHING, related_name='products_deleted_by')

    class Meta:
        ordering = ("name", )

    def __str__(self):
        return self.name

序列化器:

class CategorySerializer(serializers.ModelSerializer):
   
    class Meta:
        model = Category
        fields = ("id", "name", "created_at", "created_by", "updated_at", "updated_by", "deleted_at", "deleted_by",)

class ProductSerializer(serializers.ModelSerializer):
    # category = serializers.PrimaryKeyRelatedField(many=True, read_only=True, source="category")
    category = CategorySerializer(many=True)


    created_by = serializers.StringRelatedField()
    updated_by = serializers.StringRelatedField()
    deleted_by = serializers.StringRelatedField()
    

    class Meta:
        model = Product
        fields = (
            "id", "name", "category", "description", "price", 
            "quantity", "created_at", "created_by", "updated_at", 
            "updated_by", "deleted_at", "deleted_by",
        )

邮递员回复:

    "id": 6,
    "name": "Watch",
    "category": [
        {
            "id": 3,
            "name": "Electronics",
            "created_at": "2020-12-07T12:45:32.521172Z",
            "created_by": 2,
            "updated_at": "2020-12-07T12:45:32.521217Z",
            "updated_by": null,
            "deleted_at": null,
            "deleted_by": null
        },
        {
            "id": 4,
            "name": "Accessories",
            "created_at": "2020-12-07T12:46:00.992857Z",
            "created_by": 2,
            "updated_at": "2020-12-07T12:46:00.992910Z",
            "updated_by": null,
            "deleted_at": null,
            "deleted_by": null
        }
    ],
    "description": "Accessory for Smart Phones",
    "price": "99.99",
    "quantity": 0,
    "created_at": "2020-12-07T14:00:12.312151Z",
    "created_by": "user1",
    "updated_at": "2020-12-07T14:00:12.312222Z",
    "updated_by": null,
    "deleted_at": null,
    "deleted_by": null
}

我想实现这样的目标:

{
  "category_ids": [
    1,
    2
  ],
  "category": [
    {
      "name": "Category1"
    },
    {
      "name": "Category2"
    }
  ],
  "creator": {
    "name": "Admin"
  },
  "updater": {
    "name": "Admin2"
  }
}

我头疼。找不到解决此问题的任何方法。可能我遗漏了什么或者我不知道什么。 这是多对多领域。我尝试使用 PrimaryKeyRelatedFieldsource,但没有用。我最大的问题是,我不知道如何单独列出 category_ids

您可以使用 SerializerMethodField 来实现此目的

class CategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = Category
        fields = ("name",)

class UserSerializer(serializers.Serializer):
    name = serializers.CharField()

class ProductSerializer(serializers.ModelSerializer):
    category_ids = serializers.SerializerMethodField()
    category = CategorySerializer(many=True)

    creator = UserSerializer()
    updator = UserSerializer()

    class Meta:
        model = Product
        fields = ("category_ids","category", "creator", "updator")
    def get_category_ids(self, instance):
        return list(instance.category.all().values_list('id', flat=True))