后端
通知:python manage.py startapp inform
一、models:
数据表
1.通知:
标题-100长度
内容-文本
创建时间-自动
公开-默认不公开
作者-外键User表,级联删除,关联informs。跨表关联查询informs
部门-多对多,部门模型,关联informs。跨表关联查询informs
默认 倒排
class Inform(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
create_time = models.DateTimeField(auto_now_add=True)
public = models.BooleanField(default=False)
author = models.ForeignKey('User', on_delete=models.CASCADE, related_name='informs', related_query_name='informs')
departments = models.ManyToManyField('AIDepartment', related_name='informs', related_query_name='informs')
class Meta:
ordering = ['-create_time']
2. 通知阅读:
通知-外键Informs,级联删除,关联reads。跨表关联查询reads
用户-外键User表,级联删除,关联reads。跨表关联查询reads
阅读时间-自动
Meta:inform和user组合的数据,必须唯一
class InformRead(models.Model):
inform = models.ForeignKey(Inform, ondelete='CASCADE', related_name='informs', related_query_name='informs')
user = models.ForeignKey('User', on_delete=models.CASCADE, related_name='reads', related_query_name='reads')
read_time = models.DateTimeField(auto_now_add=True)
class Meta:
# inform和user组合的数据,必须唯一
unique_together = ['inform', 'user']
二、serializers
序列化:把数据库中的模型对象翻译成JSON格式的字典/字符串
作者:用户序列化 只读
部门:部门序列化 多对多 只读
部门id:部门列表 只写
Meta 配置
class InformSerializer(serializers.ModelSerializer):
author = UserSerializer(read_only=True)
departments = DepartmentSerializer(many=True, read_only=True)
department_id = serializers.ListField(write_only=True)
class Meta:
model = Inform
fields = '__all__'
重写Inform对象的create方法:
department_ids用pop取出来
toInt(value) return int(value)
map (toInt, department_ids) 可以改成
map(lambda value: int(value), department_ids)
对部门id进行校验:
如果有值,则设为公开
若无值。则设为过滤获取的id,再进行赋值保存,返回inform
def create(self, validated_data):
request = self.context.get('request')
departments_ids = validated_data.pop('departments')
map(lambda value: int(value), departments_ids)
if 0 in departments_ids:
inform = Inform.objects.create(public=True, author=request.user, **validated_data)
else:
departments = AIDepartment.objects.filter(id__in=departments_ids).all()
inform = Inform.objects.create(public=False, author=request.user, **validated_data)
inform.departments.set(departments)
inform.save()
三、views
引用rest_framework的视图集
ModelViewSet 实现增删改查
from rest_framework import viewsets
from .models import Inform
from .serializers import InformSerializer
class InformViewSet(viewsets.ModelViewSet):
queryset = Inform.objects.all()
serializer_class = InformSerializer
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://blog.grover.top/2025/12/16/%e6%99%ba%e8%83%bdoa%e5%8a%9e%e5%85%ac/
共有 0 条评论