ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

1.6--drf实战案例

2022-07-18 09:05:53  阅读:206  来源: 互联网

标签:1.6 verbose CASCADE -- django models drf True name


1.6 drf实战案例

1. 需求

请结合上述学习的drf知识开发 简易版《抽屉新热榜》。其中包含的功能如下:

  • 注册

    输入:手机号、用户名、密码、确认密码。
  • 登录

    输入:手机号 或 用户名  + 密码

    注意:登录成功后给用户返回token,后续请求需要在url中携带token(有效期2周)
  • 我的话题

    - 我的话题列表
    - 创建话题
    - 修改话题
    - 删除话题(逻辑删除)
  • 我的资讯

    - 创建资讯(5分钟创建一个,需要根据用户限流)    问题1:5/h   2/m; 问题2:成功后,下次再创建;
    - 文本(你问我答、42区、挨踢1024、段子)
    - 图片(图片、你问我答、42区、挨踢1024、段子)
    - 连接(图片、你问我答、42区、挨踢1024、段子)
    注意:创建时默认自己做1个推荐。
    - 我的资讯列表
  • 首页

    - 资讯首页
    - 时间倒序,读取已审核通过的资讯
    - 加载更多,分页处理
    - 支持传入参数,查询各分区资讯:图片、你问我答、42区、挨踢1024、段子   ?zone=2
  • 推荐

    - 推荐
    - 取消推荐
    - 我的推荐列表
  • 收藏

    - 收藏 or 取消收藏
    - 我的收藏列表
  • 评论

    - 查看评论列表
    - 根据【后代的更新时间】从大到小排序,读取根评论,每次读20条。
       - 读取根评论先关的子评论。
       - 将子评论挂靠到跟评论上,最终形成父子关系通过JSON返回给前端。
       注意:自己也可以通过depth实现逐步读取子评论(此处不这样操作)
       
    - 创建评论
    - 判断是根评论 or 回复
       - 回复时,深度+1
       - 评论后,找到根评论去更新【后代的更新时间】
  •  

2. 参考表结构

表结构参考:

from django.db import models


class DeletedModel(models.Model):
    deleted = models.BooleanField(verbose_name="已删除", default=False)

    class Meta:
        abstract = True


class UserInfo(DeletedModel):
    """ 用户表 """
    username = models.CharField(verbose_name="用户名", max_length=32)
    phone = models.CharField(verbose_name="手机号", max_length=32, db_index=True)
    password = models.CharField(verbose_name="密码", max_length=64)

    token = models.CharField(verbose_name="token", max_length=64, null=True, blank=True, db_index=True)
    token_expiry_date = models.DateTimeField(verbose_name="token有效期", null=True, blank=True)

    status_choice = (
        (1, "激活"),
        (2, "禁用"),
    )
    status = models.IntegerField(verbose_name="状态", choices=status_choice, default=1)
    create_datetime = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)

    class Meta:
        # The newer indexes option provides more functionality than index_together
        # index_together may be deprecated in the future.
        # https://docs.djangoproject.com/en/3.2/ref/models/options/#index-together
        indexes = [
            models.Index(fields=['username', "password"], name='idx_name_pwd')
        ]


class Topic(DeletedModel):
    """ 话题 """
    title = models.CharField(verbose_name="话题", max_length=16, db_index=True)

    is_hot = models.BooleanField(verbose_name="热门话题", default=False)
    user = models.ForeignKey(verbose_name="用户", to="UserInfo", on_delete=models.CASCADE)
    create_datetime = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)


class News(DeletedModel):
    """ 新闻资讯 """
    zone_choices = ((1, "42区"), (2, "段子"), (3, "图片"), (4, "挨踢1024"), (5, "你问我答"))
    zone = models.IntegerField(verbose_name="专区", choices=zone_choices)

    title = models.CharField(verbose_name="文字", max_length=150)
    url = models.CharField(verbose_name="链接", max_length=200, null=True, blank=True)

    # xxxxx?xxxxxx.png,xxxxxxxx.jeg
    image = models.TextField(verbose_name="图片地址", help_text="逗号分割", null=True, blank=True)

    topic = models.ForeignKey(verbose_name="话题", to="Topic", on_delete=models.CASCADE, null=True, blank=True)
    user = models.ForeignKey(verbose_name="用户", to="UserInfo", on_delete=models.CASCADE)

    create_datetime = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)
    status_choice = (
        (1, "待审核"),
        (2, "已通过"),
        (3, "未通过"),
    )
    status = models.IntegerField(verbose_name="状态", choices=status_choice, default=1)

    collect_count = models.IntegerField(verbose_name="收藏数", default=0)
    recommend_count = models.IntegerField(verbose_name="推荐数", default=0)
    comment_count = models.IntegerField(verbose_name="评论数", default=0)


class Collect(models.Model):
    """ 收藏 """
    news = models.ForeignKey(verbose_name="资讯", to="News", on_delete=models.CASCADE)
    user = models.ForeignKey(verbose_name="用户", to="UserInfo", on_delete=models.CASCADE)
    create_datetime = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)

    class Meta:
        # unique_together = [['news', 'user']]
        constraints = [
            models.UniqueConstraint(fields=['news', 'user'], name='uni_collect_news_user')
        ]


class Recommend(models.Model):
    """ 推荐 """
    news = models.ForeignKey(verbose_name="资讯", to="News", on_delete=models.CASCADE)
    user = models.ForeignKey(verbose_name="用户", to="UserInfo", on_delete=models.CASCADE)
    create_datetime = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['news', 'user'], name='uni_recommend_news_user')
        ]


class Comment(models.Model):
    """ 评论表 """
    news = models.ForeignKey(verbose_name="资讯", to="News", on_delete=models.CASCADE)
    user = models.ForeignKey(verbose_name="用户", to="UserInfo", on_delete=models.CASCADE)
    content = models.CharField(verbose_name="内容", max_length=150)

    depth = models.IntegerField(verbose_name="深度", default=0)

    root = models.ForeignKey(verbose_name="根评论", to="Comment", related_name="descendant", on_delete=models.CASCADE,
                             null=True, blank=True)

    reply = models.ForeignKey(verbose_name="回复", to="Comment", related_name="reply_list", on_delete=models.CASCADE,
                              null=True, blank=True)

    create_datetime = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)

    # 针对根评论
    descendant_update_datetime = models.DateTimeField(verbose_name="后代更新时间", auto_now_add=True)
View Code

3. 案例讲解

3.1 环境准备

  • 基于django创建项目,例如:dig

  • 安装必备模块

django-filter==2.4.0
django-redis==5.0.0
djangorestframework==3.12.4
  • 创建app,例如:api

  • 注册app

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'django_filters',
    'api.apps.ApiConfig'
]
  • 拷贝表结构到 models.py 并 生成数据库

3.2 接口开发

详细见代码

 

标签:1.6,verbose,CASCADE,--,django,models,drf,True,name
来源: https://www.cnblogs.com/erhuoyuan/p/16489154.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有