0%

django使用

一边写 docker 一边写 django 吧,欠债还钱啊。首先对照官方文档,它们已经不那么 shit 了

https://docs.djangoproject.com/zh-hans/4.0/intro/tutorial01/

参照这个,manage.py 上面的那一层目录可以随意重命名

叮咚,init.py 的妙用

https://www.jianshu.com/p/73f7fbf75183

方便导入多个的时候执行

app 负责具体功能实现,project 本身装载,然而最高层的 url.py 才是标记哪里到哪里的,视图大概是会体现什么?

函数 include() 允许引用其它 URLconfs。每当 Django 遇到 include() 时,它会截断与此项匹配的 URL 的部分,并将剩余的字符串发送到 URLconf 以供进一步处理。

所以只要包含了就行?

1
path('polls/', include('polls.urls')),

path() 参数: route

route 是一个匹配 URL 的准则(类似正则表达式)。当 Django 响应一个请求时,它会从 urlpatterns 的第一项开始,按顺序依次匹配列表中的项,直到找到匹配的项。

这些准则不会匹配 GET 和 POST 参数或域名。例如,URLconf 在处理请求 https://www.example.com/myapp/ 时,它会尝试匹配 myapp/ 。处理请求 https://www.example.com/myapp/?page=3 时,也只会尝试匹配 myapp/

path() 参数: view

当 Django 找到了一个匹配的准则,就会调用这个特定的视图函数,并传入一个 HttpRequest 对象作为第一个参数,被“捕获”的参数以关键字参数的形式传入。稍后,我们会给出一个例子

得了一切都很麻烦,从 model 开始做吧,model 其实就是写数据库,这次是三个模型

https://docs.djangoproject.com/zh-hans/4.0/topics/db/examples/many_to_one/

1
2
3
4
5
6
7
8
9
10
class Article(models.Model):
headline = models.CharField(max_length=100)
pub_date = models.DateField()
reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)

def __str__(self):
return self.headline

class Meta:
ordering = ['headline']

总是忍不住要打分号……anyway,meta不知道是啥意思,反正内容这样就可以了

去记录时间可以用 datetimefield dateRecorded = models.DateTimeField()

使用 TimeStampedModel 它会自动维系 created and modified field,使用它替代原来的 model

serializer

嘛,要来回传送数据所以要互相转换,这里是用新建了一个 serializer py 文件的方式

https://www.liujiangblog.com/course/django/171

1 - Serialization - Django REST framework

看看这个……那么这里要直接使用隔壁 model 的定义

1
2
3
4
class SnippetSerializer(serializers.ModelSerializer):
class Meta:
model = Snippet
fields = ['id', 'title', 'code', 'linenos', 'language', 'style']

这个返回的话就是根据 model snippet 返回的 json

1
2
3
4
5
6
7
8
# blog/serializers.py
class ArticleSerializer(serializers.ModelSerializer):


class Meta:
model = Article
fields = '__all__'
read_only_fields = ('id', 'author', 'create_date')

回复是

然后可以在上面复写 read-only

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class UserFeedbackSerializer(serializers.ModelSerializer):
"""Serializer for user feedbacks."""
reply = UserFeedbackReplySerializer(
read_only=True
)

class Meta:
"""Metadata for user feedback serializer."""
model = UserFeedback
fields = ('id', 'content', 'reply', 'type', 'created', 'modified')
extra_kwargs = {
'content': {'required': True},
'type': {'required': True},
}

def create(self, validated_data):
"""Create a feedback based on provided data and data from the serializer context."""
request = self.context.get("request")
user = request.user
feedback = UserFeedback.objects.create(
content=validated_data['content'],
type=validated_data['type'],
user=user
)

return feedback

现在要做的是 create plan of action,参考那边的 create reply

先要创造不包含任何的,comment?

先写 comment,然后是 milestone,然后 pla,comment 和 milestone 回复 pla

metadata 里面是包含什么,记得要有 created, id, modified, 这是本来就有的,还要搭配什么必须有,好像可以用 __all__ ? 不管了

设置 type
1
2
3
4
5
6
7
8
9
10
11
12
class YearInSchool(models.TextChoices):
FRESHMAN = 'FR', _('Freshman')
SOPHOMORE = 'SO', _('Sophomore')
JUNIOR = 'JR', _('Junior')
SENIOR = 'SR', _('Senior')
GRADUATE = 'GR', _('Graduate')

year_in_school = models.CharField(
max_length=2,
choices=YearInSchool.choices,
default=YearInSchool.FRESHMAN,
)

‘FR’, ‘SO’ 是实际值,Freshmen 是人可读形式,展开来是这样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Student(models.Model):
FRESHMAN = 'FR'
SOPHOMORE = 'SO'
JUNIOR = 'JR'
SENIOR = 'SR'
GRADUATE = 'GR'
YEAR_IN_SCHOOL_CHOICES = [
(FRESHMAN, 'Freshman'),
(SOPHOMORE, 'Sophomore'),
(JUNIOR, 'Junior'),
(SENIOR, 'Senior'),
(GRADUATE, 'Graduate'),
]
year_in_school = models.CharField(
max_length=2,
choices=YEAR_IN_SCHOOL_CHOICES,
default=FRESHMAN,
)

FRESHMEN 这些是常量,给这些值赋予常量方便之后引用?

_('personal') 翻译,象征需要有相应钩子

view

这里是使用了 apiview 还有啥……modelview,这个是最高抽象,让我看看怎么用

Generic views - Django REST framework中文站点

继承 mixin 或者后面的 ModelViewSet 来enable 基本的创建,修改等等活,引用 serializer

草,要查找大概要用 #### filter_queryset(self, queryset) 让我康康哪个继承了

test case

使用 test 开头的测试 func,然后 snake_case, setUp 和 tearDown 在开始和结束的时候放去 set data,然后用 assertEqual 来测试是否一致.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class TestCommentMentor(TestCase):
"""
testing for comment
"""
def test_create(self):
"""
test mentor create comment
"""

data = {
"content" : "Test data"
}

serializer = CommentMentorSerializer()
result = serializer.create(data)

self.assertEqual(result.content, data['content'])

先设置 data,再引入 serializer,然后创建或者 update,再对比是否一致,update 的话先在 func 里面 create 再 update

create 直接用 model 去 create

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def test_update(self):
"""
Test updating replies for a user feedback.
"""
data = {
"content": "Updated Content",
}

update_request = APIRequestFactory().post('fakepath')
update_request.user = self.other_admin
force_authenticate(update_request, user=self.other_admin)

reply = UserFeedbackReply.objects.create(
feedback=self.feedback,
content="Initial Content",
admin=self.admin
)

serializer = UserFeedbackReplyAdminSerializer(instance=reply, context={
"request": update_request,
})

serializer.update(reply, data)

self.assertEqual(reply.admin, self.other_admin)
self.assertEqual(reply.content, data['content'])

python -m unittest test_serializers.py

测试

传入的 fk 如果是直接关联到实力就要用实例关联 qwq