前言
如果对一个含有多对多、外键的模型进行序列化,这时候这些关联的字段会只展示id
外键序列化(ForeignKey)&多对多序列化(manytomany)
models
class Category(models.Model):
"""
Django 要求模型必须继承 models.Model 类。
Category 只需要一个简单的分类名 name 就可以了。
CharField 指定了分类名 name 的数据类型,CharField 是字符型,
CharField 的 max_length 参数指定其最大长度,超过这个长度的分类名就不能被存入数据库。
当然 Django 还为我们提供了多种其它的数据类型,如日期时间类型 DateTimeField、整数类型 IntegerField 等等。
Django 内置的全部类型可查看文档:
https://docs.djangoproject.com/en/1.10/ref/models/fields/#field-types
"""
name = models.CharField(max_length=100)
def catcount(self):
return Articles.objects.filter(category__name__exact=self.name).filter(status='有效').count()
def __str__(self):
return self.name
class Tag(models.Model):
"""
标签 Tag 也比较简单,和 Category 一样。
再次强调一定要继承 models.Model 类!
"""
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Articles(models.Model):
id = models.AutoField(primary_key=True) # id
title = models.CharField(max_length=150) # 博客标题
body = models.TextField() # 博客正文
timestamp = models.DateTimeField() # 创建时间
authorname = models.ForeignKey('JiaBlog.BlogUser', on_delete=models.CASCADE) # 作者姓名
views = models.PositiveIntegerField(default=0)
category = models.ForeignKey(Category, on_delete=models.CASCADE, primary_key=False)
tags = models.ManyToManyField(Tag, blank=True, null=True)
greats = models.PositiveIntegerField(default=0)
comments = models.IntegerField(default=0)
status = models.CharField(max_length=20, default="DEL")
brief = models.CharField(max_length=200, blank=True, null=True)
pic = models.ImageField(upload_to='jiablogimages')
# bodypic = models.ImageField(upload_to='jiablogimages', blank=True, null=True)
istop = models.CharField(max_length=5, default='', null=True, blank=True)
articlebodybrief = models.TextField(blank=True, null=True)
序列化
class ArticlesSerializers(serializers.ModelSerializer):
authorname = serializers.CharField(source='authorname.name')
category = serializers.CharField(source='category.name')
tags = serializers.StringRelatedField(many=True)
class Meta:
model = Articles # 指定的模型类
fields = ('id', 'title', 'body', 'timestamp', 'authorname', 'views', 'tags', 'category') # 需要序列化的属性