在 DRF(Django REST Framework)的ModelSerializer中,CharField(以及其他字段类)的source参数用于指定该字段的数据来源。其可接受的参数类型主要包括以下几种:
1. 直接指定模型的字段名称
最常见的用法是直接关联模型中定义的字段名,此时序列化器会直接读取模型对应字段的值。
示例:
假设模型定义如下:
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=50)
序列化器中通过source指定模型字段:
class BookSerializer(serializers.ModelSerializer):
book_title = serializers.CharField(source='title') # 关联模型的title字段
writer = serializers.CharField(source='author') # 关联模型的author字段
class Meta:
model = Book
fields = ['book_title', 'writer']
```
2. 指定模型的方法或属性
source可以指向模型中定义的方法(无需括号)或属性,序列化器会自动调用该方法(或访问属性)并使用其返回值作为字段值。
示例:
2.1模型中定义方法 / 属性:
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=50)
publish_year = models.IntegerField()
# 定义一个属性
@property
def full_info(self):
return f"{self.title} by {self.author} ({self.publish_year})"
# 定义一个方法
def get_publish_decade(self):
return f"{self.publish_year // 10 * 10}s"
2.2序列化器中通过source关联方法 / 属性:
class BookSerializer(serializers.ModelSerializer):
info = serializers.CharField(source='full_info') # 关联属性
decade = serializers.CharField(source='get_publish_decade') # 关联方法(不带括号)
class Meta:
model = Book
fields = ['info', 'decade']
3. 通过点符号访问关联对象的字段 / 方法
如果模型存在外键、一对一等关联关系,source可以通过点符号(.) 链式访问关联对象的字段、方法或属性。
示例:
3.1模型关联关系:
class Author(models.Model):
name = models.CharField(max_length=50)
country = models.CharField(max_length=50)
def get_full_country(self):
return f"Country: {self.country}"
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.ForeignKey(Author, on_delete=models.CASCADE) # 外键关联
3.2序列化器中访问关联对象的成员:
class BookSerializer(serializers.ModelSerializer):
author_name = serializers.CharField(source='author.name') # 关联对象的字段
author_country = serializers.CharField(source='author.get_full_country') # 关联对象的方法
class Meta:
model = Book
fields = ['title', 'author_name', 'author_country']
4. 特殊值’*’
source='*'表示将整个对象作为数据源,此时字段的值会是该对象的字符串表示(即调用__str__方法的结果)。
示例:
class BookSerializer(serializers.ModelSerializer):
book_str = serializers.CharField(source='*') # 等价于str(book对象)
class Meta:
model = Book
fields = ['book_str']
总结
source参数的核心作用是指定字段数据的来源路径,其可接受的参数形式包括:
- 模型自身的字段名、属性名、方法名(字符串形式,方法名不带括号);
- 关联对象的字段 / 属性 / 方法(通过点符号链式访问);
- 特殊值’*'(表示整个对象的字符串表示)。 通过灵活使用source,可以在不修改模型的情况下,灵活定制序列化器的输出数据。
1709

被折叠的 条评论
为什么被折叠?



