如何使嵌套序列化程序以给定方式表示数据?
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"
}
}
我头疼。找不到解决此问题的任何方法。可能我遗漏了什么或者我不知道什么。
这是多对多领域。我尝试使用 PrimaryKeyRelatedField
和 source
,但没有用。我最大的问题是,我不知道如何单独列出 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))
型号:
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"
}
}
我头疼。找不到解决此问题的任何方法。可能我遗漏了什么或者我不知道什么。
这是多对多领域。我尝试使用 PrimaryKeyRelatedField
和 source
,但没有用。我最大的问题是,我不知道如何单独列出 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))