對于管理系統,常常需要展示列表數據,我們對于列表內的數據常常需要查找、過濾、排序等操作,其中查找等操作大部分是在后臺進行的。django rest framework可以輕松的實現數據的查找、過濾等操作。接下來我們將以實際的例子進行介紹。
示例代碼github地址: https://github.com/jinjidejuren/drf_learn
例如cmdb系統,作為資產管理系統常常需要對數據進行過濾或查找,獲取期望的信息。
實現model
1.在這個示例項目中,需要實現對物理服務器的條件過濾,物理服務器的model列表如下(apps/assets/models.py文件):
class Server(models.Model): """ 物理服務器 """ status_choice = ( ('online', '上線'), ('offline', '下線'), ('normal', '正常'), ('abnormal', '異常') ) server_name = models.CharField(verbose_name=u'服務器名稱', max_length=128, blank=False, null=False) server_num = models.CharField(verbose_name=u'服務器編號', max_length=128, blank=True, null=True) brand = models.CharField(verbose_name=u'品牌', max_length=64, blank=True, null=True) model = models.CharField(verbose_name=u'型號', max_length=64, blank=True, null=True) cpus = models.IntegerField(verbose_name=u'cpu核數', default=0) ram = models.IntegerField(verbose_name=u'內存大小', default=0) disk = models.IntegerField(verbose_name=u'磁盤大小', default=0) product_date = models.DateTimeField(verbose_name=u'生產日期', auto_now_add=True) status = models.CharField(verbose_name=u'狀態', max_length=16, choices=status_choice) created_time = models.DateTimeField(verbose_name=u'創建時間', auto_now_add=True) modified_time = models.DateTimeField(verbose_name=u'修改時間', auto_now_add=True) class Meta: verbose_name = u'服務器' verbose_name_plural = verbose_name def __str__(self): return self.server_name
實現serializer
接下來需要實現server這個model的序列化類,在apps/assets/serializers.py中編寫:
class ServiceSerializer(serializers.ModelSerializer): """ 服務器序列化 """ class Meta: model = Server fields = ('id', 'server_name', 'server_num', 'brand', 'model', 'cpus', 'ram', 'disk', 'product_date', 'status', 'created_time', 'modified_time')
對于fields來說,可以使用 _ all _ 來代表所有的字段,除了model中定義的field外,序列化還可以指定其他的信息,比如嵌套信息或者自定義的信息。具體可以取決于業務邏輯。
實現modelviewset
對于modelviewset,我們可以圍繞它對用戶請求做相應的處理。常見的是對model進行增加、刪除、查找、修改等。在這部分我們需要實現ServerViewSet:
class ServerViewSet(viewsets.ModelViewSet): """ 物理服務器視圖 """ queryset = Server.objects.all().order_by('-created_time') serializer_class = ServerSerializer pagination_class = MyFormatResultsSetPagination
新聞熱點
疑難解答