智能OA办公

Ryder 2025-12-16 6 12/16

后端

通知: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

 

 

 

 

- THE END -

Ryder

12月19日15:47

最后修改:2025年12月19日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论