# 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)