Shawn's Blog
目录 · 7 节

Django REST framework 中要注意的几个点

0X00 Model中要注意的几点

verbose_name 和 help_text 属性

Model中通常第一个参数指定的是verbose_name,还要手动指定一个help_text属性。其中verbose_name属性是用来我们自己读的,而help_text是用于提供字段描述类的功能,比如在DJango Admin中verbose_name会变成字段的中文名,而help_text则会变成改字段的描述。

unicode 方法

每一个Model类我们最好都要重写一下这个__unicode__方法,使之返回一个有意义的数据。比如一个学生信息的Model,我们不去重写这个方法,最后在ipython中或是项目中直接调的话就是这个样子的<QuerySet <Student: 1>, <Student: 2>, <Student: 3>]>。如果我们重写了这个方法

python
1def __unicode__(self):
2    return '({gender}){name}'.format(gender=self.gender, name=self.name)

那么返回值就是“<QuerySet <Student: (男)小明>, <Student: (女)小红>, <Student: (女)小兰d>]>`。不仅是在调试过程中还是程序里都会有不错的效果。

关于choices

在设计Model中常会用到choices属性,比较好的用法是这样的。命名的时候使用在字段名后加choice的全大写,也就是:GENDER_CHOICE

python
1GENDER_CHOICE = (
2    ('male', u''),
3    ('female', u''),
4    ('other', u'其他'),
5)
6
7gender = models.Charfield(
8    u'性别',
9    help_text=u'性别',
10    max_length=100,
11    choices=GENDER_CHOICE,
12)

0X01 Serializer中要注意的几点

针对list方法的Serializer

还是上面学生信息的这个例子,前端调用GET方法后想要得到的明显是男、女、未知这种,所以我们应该为所有类似的字段搭配返回一个对应的可读字段。例如在获取学生信息时可以这样写Serializer。

python
1class ListStudentSerialzier(serializers.ModelSerializer):
2
3    gender_cn = serializers.SerializerMethodField()
4
5    def get_gender_cn(self, obj):
6        return obj.get_gender_display()
7
8    class Meta:
9        model = Student
10        fields = (
11            'id',
12            'name',
13            'gender',
14            'gender_cn',
15            'birthday',
16            'hobbys',
17        )

在针对List的Serializer中添加字段gender_cn,顾名思义就是性别的中文,定义为serializers.SerializerMethodField(),定且在下面跌一个名为def get_gender_ch(self, obj)的方法,组装好所需要的数据返回就可以了。参数中的obj就是都应的实例化对象,在此处也就是一个Student对象。 最后要在Meta中的fields里加上这个字段。

另外,如果将Model中一个字段定义为CharField且Serializer处使用ListField进行校验存储的话,数据库中就会是类似"[1, 2, 3, 4, 5]"的“列表样子的字符串”。如果想让这种类型的字符串以一个正确的列表方式返回,例如字段hobbys,那么应该像gender_cn一样编写一个get方法,使用json.loads()的方式将“列表样子的字符串”转换为真正的列表返回。

针对Create和Update的Serializer

针对Create和Update的Serializer是要向Django推数据的,所以需要注意字段的合法性校验。要注意SerializerModel中字段类型的对应,例如Serializer中的ListFIeld其实就是Model中的CharField

本文标题
Django REST framework 中要注意的几个点
文章作者
Shawn
版权声明
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

如果这篇文章对你有帮助,可以请我喝杯咖啡 ☕

评论