restful专栏 03.使用drf实现前后端分离 02.序列化关系模型

 

# 02.序列化关系模型

[toc]{type: "ol", level: [2, 3, 4, 5]}

### 配置商品信息
```python
### shop.serializers
class GoodsModelSerializer(serializers.ModelSerializer):
    # 在一对多的多方进行关联时的方法:
    # 在序列化时指定字段            根据外键字段显示商品分类:模型名.字段名  禁止修改分类信息
    category_value = serializers.CharField(source='category.name', read_only=True)

    class Meta:
        model = Goods
        # 用元组或列表指定序列化的字段
        fields = ['name', 'desc', 'category', 'category_value']
```
![drf](imgs/08.png)
![drf](imgs/09.png)
<br><br>


### 配置分类信息
#### 添加关系字段
```python
### shop.models
class Goods(models.Model):
    category = models.ForeignKey(
        Category, on_delete=models.CASCADE, verbose_name="分类名称",
        # 未定义该字段,查找商品:category.goods_set.all()
        # 定义该字段后,查找商品:category.goods.all()
        related_name='goods'
    )
```
#### 基础配置
```python
### shop.serializers
from rest_framework import serializers
from shop.models import *


class CategoryModelSerializer(serializers.ModelSerializer):
    # goods = ...
    # models.Goods.category字段中的(related_name='goods')参数保持一致
    class Meta:
        model = Category
        fields = ["name", "goods"]
```
#### 字段种类
##### 字符串关联字段
```python
    # 显示模型中__str__方法的返回值
    # 允许显示多条:many=True
    goods = serializers.StringRelatedField(many=True)
```
![drf](imgs/10.png)
##### 主键值关联字段
```python
    # 不可以在分类中修改商品,因此要求read_only=True
    goods = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
```
![drf](imgs/11.png)
##### 自选择关联字段
```python
    # 从商品模型类的字段中进行选择
    goods = serializers.SlugRelatedField(slug_field='desc', many=True, read_only=True)
```
![drf](imgs/12.png)
#### 超链接关联字段
```python
    # view-name:表单名加-detail
    # app与urls问题可能导致bug
    goods = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='goods-detail')
```
##### 自定义关联字段
```python
# 自定义显示内容的类
class CustomRelatedField(serializers.RelatedField, ABC):
    """重写以下方法:"""
    def to_representation(self, value):
        return str(value.id) + " " + value.name + "----" + value.desc
```
```python
    # 使用自定义的类
    goods = CustomRelatedField(many=True, read_only=True)
```
![drf](imgs/13.png)
##### 使用商品序列化类
```python
goods = GoodsModelSerializer(many=True, read_only=True)
```
![drf](imgs/14.png)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值