1:url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),这是drf登陆的配置。
2: serializers.ModelSerializer依赖于某个模型类;需要进行说明:
class Meta:
model = ProductClass
fields = '__all__'
serializers.serializers不需要依赖于模型类,可直接进行定义,验证,但是不可以往mysql进行存储。
3: serializers.serializers
4: models.py
from django.db import models
class CategoryClass(models.Model):
name = models.CharField(max_length=100, verbose_name='种类名称')
class Meta:
db_table = 'category'
def __str__(self):
return self.name
class ProductClass(models.Model):
name = models.CharField(max_length=128, verbose_name='产品名称')
price = models.DecimalField(max_digits=9, decimal_places=2, verbose_name='产品价格')
count = models.IntegerField(default=0, verbose_name='产品库存')
category = models.ForeignKey('CategoryClass', on_delete=models.CASCADE, verbose_name='产品种类', related_name='products_set')
class Meta:
db_table = 'products'
serializer.py
class ProdectClassSerialiser(serializers.ModelSerializer):
# 第一种方法
# category = serializers.IntegerField(source='category.id')
# category_name = serializers.CharField(source='category.name')
# 第二种方法
category_id = serializers.ReadOnlyField()
category_name = serializers.ReadOnlyField()
class Meta:
model = ProductClass
fields = ('name', 'price', 'count', 'category', 'category_id', 'category_name')
第一种结果:
# [
# {
# "name": "猪肉",
# "price": "22.00",
# "count": 100,
# "category": 1,
# "category_id": 1,
# "category_name": "肉类"
# },
# {
# "name": "面粉",
# "price": "5.00",
# "count": 54,
# "category": 3,
# "category_id": 3,
# "category_name": "粮油"
# }
# ]
第二种结果:
# [
# {
# "name": "猪肉",
# "price": "22.00",
# "count": 100,
# "category": 1,
# "category_id": 1,
# "category_name": [
# 1,
# "肉类"
# ]
# },
# {
# "name": "面粉",
# "price": "5.00",
# "count": 54,
# "category": 3,
# "category_id": 3,
# "category_name": [
# 3,
# "粮油"
# ]
# }
# ]
class CategorySerializer(serializers.ModelSerializer):
products_set = ProdectClassSerialiser(many=True)
class Meta:
model = CategoryClass
fields = ('id', 'name', 'products_set')
# 这是将一对多的关系在一的表里进行了序列化,这样在一的表里能够拿到所关联的所有多表中的对象信息。但是该类必须在ProdectClassSerialiser定义之后才能使用,否则报错。
[
{
"id": 1,
"name": "肉类",
"products_set": [
{
"name": "猪肉",
"price": "22.00",
"count": 100,
"category": 1,
"category_id": 1,
"category_name": "肉类"
},
{
"name": "排骨",
"price": "26.00",
"count": 199,
"category": 1,
"category_id": 1,
"category_name": "肉类"
}
]
},
{
"id": 2,
"name": "水果",
"products_set": []
},
{
"id": 3,
"name": "粮油",
"products_set": [
{
"name": "面粉",
"price": "5.00",
"count": 54,
"category": 3,
"category_id": 3,
"category_name": "粮油"
}
]
},
{
"id": 4,
"name": "服装",
"products_set": []
}
]