ImproperlyConfigured: WSGI application 'lightapi.wsgi.application' could not be loaded;
在moddleware中加了一个 'corsheaders.middleware.CorsMiddleware' ,但是这个app并没有在上面注册(其实也没有安装),在将其注释之后,即可运行了
创建app的流程:
在虚拟环境中运行 Python manage.py startapp 应用名
--->>> 在settings.py中注册应用 ---->>> 在url 中创建路由(主路由与子路由)
-->>> 在models.py建表-->创建adminx.py文件,配置全局设置,注册该应用下model中的表
-->>>在__init__.py中配置 default_app_config = "home.apps.HomeConfig" ---xadmin中的显示效果
--->>> apps.py 里面设置 verbose_name = ‘我的首页’ 设置后台管理系统侧边栏的应用名为自定义的名字
--->>> views.py 中写视图函数
---->>> 设置serializers.py 序列化类
ModuleNotFoundError: No module named 'apps' 在创建完app之后,进行数据迁移,报了这个错
检查dev.py(开发环境的settings)发现没有将apps这个文件夹的路径加入到环境变量中
RuntimeError: Model class lightapi.apps.home.models.Banner doesn't declare an explicit app_label and isn't in an application in
INSTALLED_APPS.将各apps.py的文件重新写了,然后迁移数据库时就没有显示问题,很玄学
同时注意一下导入包的路径问题
07.28 在网上查的,说的是将绝对路径改为相对路径,就可以 --> 今天出了问题之后,改了一下发现,确实不报错了
WARNING basehttp 154 "POST /user/login/mobile/ HTTP/1.1" 403 58 前端登录部分代码,在使用短信验证码登录的时候,返回该错误!
django.db.utils.InternalError: (1050, "Table 'light_news_category' already exists")
先执行:python manage.py migrate --fake
再次执行:python manage.py migrate
__str__ returned non-string (type int)
将orm表中的__str__的返回参数改掉就行了
django.db.utils.ProgrammingError: (1146, "Table 'light.light_news_recommend' doesn't exist")
django.db.utils.InternalError: (1060, "Duplicate column name 'article_id'")
忘记写如何解决的了
WARNING basehttp 154 "POST /user/register/mobile/ HTTP/1.1" 403 58 后端路由、函数是正常的,不知道为什么就是403
解决办法:在目标视图类中添加 authentication_classes = [ ] 即可,即可正常了
需要获取关于某一篇文章的所有评论,使用的是ListAPIView,但是呢,以往使用的都是获取表的所有的数据,然后在这里就不知道怎么做了,
后来,在鼓捣了半天的源码之后,拿出了get_queryset方法,进行重写,在里面拿到了前端传过来的文章id,并且更改了查询数据库的sql代码,之后成功实现目标,,,
---> 刚在想,我是不是可以直接在类里面重写init方法,拿到self.request就可以了啊,这样也不需要在get_queryset里面操作了,但是转眼又想到,直接在类里面是无法 self.request的, 但是又想,是不是可以设置@property来设置成静态属性(试了一下,并不行 --> 可能是方法或技术的原因)
好在找出了一条可行的办法
def __init__(self, *args, **kwargs): super().__init__() self.article_id = '' def get_queryset(self): ..占地方,就删掉了,实际不能删... queryset = self.queryset from django.db.models.query import QuerySet if isinstance(queryset, QuerySet): self.article_id = self.request.query_params.get("article_id") # --------------------- # Ensure queryset is re-evaluated on each request. queryset = queryset.filter(article_id=self.article_id, is_show=True) # --改的这一条-------------- return queryset
为什么在create一条数据的时候,有点外键不能使是int型(或str,但是必须是数字),有的就得是数据库查询得数据(fiter查询出的数据)?
例如:ValueError: Cannot assign "2": "Comment.user" must be a "User" instance.(comment字段关联user表)
粉丝和被关注表: Reverse accessor for 'FansAndObserved.user' clashes with reverse accessor for 'FansAnd
Observed.observed'.HINT: Add or change a related_name argument to the definition for 'FansAndObserved.observed' or 'FansAndObserved.user'. 我估计是因为我一张表中同时两个字段关联了同一张表,而且设置的是foreiginKey ,是否需要设置成manytomany才行? ---> 需要关联字段 related_name= "" ---》 Direct assignment to the reverse side of a related set is prohibited. Use mobile.set() instead. 最终实现结果: related_name= "" 定义的是字段名称,不要和user表里面的字段重复即可 推测 ---> 应该是用在表中同时关联某一张表多次时,用related_name来区分关联的多个字段
继承RetrieveAPIView去数据库中的单条数据,但是,又不想在URL后面加上用户id,像是这样 http://api.light.cn:8000/user/userinfo/2 ,自己的想法就是,前端传过来一个token,然后通过这个token去redis里面拿出对应用户的id,之后再通过retrieveAPIView内的方法从数据库中拿出单条数据,此时的URL,应该是这样的:http://api.light.cn:8000/user/userinfo/?token= 。。。(跟的是具体的token)
---> 去源码中发现,原本URL该写成这样: http://api.light.cn:8000/user/userinfo/(?P(<pk>\d+)) ,原本以为,此处的 pk 是任意定义的,但是在retrieveAPIView继承的GenericAPIView中定义了: ``` # If you want to use object lookups other than pk, set 'lookup_field'. # For more complex lookup requirements override `get_object()`. lookup_field = 'pk' lookup_url_kwarg = None ``` 上面的那个lookup_field 参数就是识别URL中的pk的,下面的lookup_url_kwarg应该是从传过来的参数中获取值,具体源代码在下面: ``` # Perform the lookup filtering. lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field ``` 然后过滤的条件就是这两个参数决定的,**这两个参数写在 get_object 方法里面**, ----》》》》开始的想法是重写get_object方法,但是,写了半天也没有将过滤条件写出来,于是换了思路 ----》》》我去找上一层,其中在 **RetrieveModelMixin** 这个类中有 ``` def retrieve(self, request, *args, **kwargs): instance = self.get_object() serializer = self.get_serializer(instance) return Response(serializer.data) ``` 仔细看看,发现返回的数据也是在这里面操作的,第二行应该是获取queryset数据了,第三行是序列化,那么我只将第二行的数据注释掉,自己从数据库里面拿数据不就行了嘛,,, ----》》》 实践结果发现,确实拿到了目标数据,并且URL也变成了http://api.light.cn:8000/user/userinfo/?token= 。。。(跟的是具体的token)
退出登录的时候,redis里面的token没有删掉,这个是还需要优化的