valar 1.2.0__py3-none-any.whl → 1.2.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of valar might be problematic. Click here for more details.

valar/apps.py CHANGED
@@ -1,9 +1,7 @@
1
1
  import os
2
2
  from django.apps import AppConfig
3
- from .classes.app_mixins.auto_migration_mixin import AutoMigrationMixin
4
- from .classes.app_mixins.auto_urlpatterns_mixin import AutoUrlPatternsMixin
5
-
6
- valar_app = __package__.replace('src.', '')
3
+ from valar_app_mixins.auto_migration_mixin import AutoMigrationMixin
4
+ from valar_app_mixins.auto_urlpatterns_mixin import AutoUrlPatternsMixin
7
5
 
8
6
 
9
7
  class ValarConfig(AutoMigrationMixin, AutoUrlPatternsMixin, AppConfig):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: valar
3
- Version: 1.2.0
3
+ Version: 1.2.2
4
4
  Summary: valar for morghulis
5
5
  Home-page: https://gitee.com/GRIFFIN120/valar_dev
6
6
  Author: LYP
@@ -16,6 +16,7 @@ Requires-Dist: pandas==2.2.3
16
16
  Requires-Dist: openpyxl==3.1.5
17
17
  Requires-Dist: deepmerge~=2.0
18
18
  Requires-Dist: minio==7.2.2
19
+ Requires-Dist: valar-auto-mixins~=0.0.1
19
20
  Dynamic: author
20
21
  Dynamic: author-email
21
22
  Dynamic: description
@@ -27,12 +28,13 @@ Dynamic: requires-python
27
28
  Dynamic: summary
28
29
 
29
30
  valar for morghulis
31
+
30
32
  # 1. install
33
+
31
34
  ```shell
32
35
  pip install valar
33
36
  ```
34
37
 
35
-
36
38
  # 1. settings
37
39
 
38
40
  ```python
@@ -47,16 +49,12 @@ BASE_APP = str(BASE_DIR.name)
47
49
  DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
48
50
  SECRET_KEY = get_random_secret_key()
49
51
 
50
-
51
-
52
52
  """ Valar Options """
53
53
 
54
54
  HANDLER_MAPPING = "%s.urls.channel_mapping" % BASE_APP
55
55
  MONGO_URI = 'mongodb://root:19870120@121.41.111.175:27017/'
56
56
  MINIO_URL = "s3://admin:password@120.27.8.186:9000"
57
57
 
58
-
59
-
60
58
  """ Minimized compulsory settings """
61
59
 
62
60
  DATABASES = {
@@ -69,7 +67,7 @@ INSTALLED_APPS = [
69
67
  'django.contrib.sessions',
70
68
  "corsheaders",
71
69
  'channels',
72
- 'valar',
70
+ 'valar.apps.ValarConfig',
73
71
  ]
74
72
  MIDDLEWARE = [
75
73
  'django.contrib.sessions.middleware.SessionMiddleware',
@@ -99,6 +97,7 @@ FILE_UPLOAD_MAX_MEMORY_SIZE = 1024 * 1024 * 100
99
97
  DATA_UPLOAD_MAX_MEMORY_SIZE = 1024 * 1024 * 100
100
98
 
101
99
  ```
100
+
102
101
  # 2. asgi
103
102
 
104
103
  ```python
@@ -117,8 +116,8 @@ application = ProtocolTypeRouter({
117
116
  ```
118
117
 
119
118
  # 3. migrate
120
- no need, valar will auto migration
121
119
 
120
+ no need, valar will auto migration
122
121
 
123
122
  # 4. root urls
124
123
 
@@ -126,7 +125,6 @@ no need, valar will auto set urlpatterns
126
125
 
127
126
  # 5. how to use valar_channel
128
127
 
129
-
130
128
  5.1 set HANDLER_MAPPING in settings
131
129
 
132
130
  ```python
@@ -137,13 +135,11 @@ HANDLER_MAPPING = "%s.urls.channel_mapping" % BASE_APP
137
135
 
138
136
  ```python
139
137
  from valar.channels.sender import ValarSocketSender
138
+
139
+
140
140
  def test_handler(sender: ValarSocketSender):
141
141
  data = sender.data
142
- length = data.get('length',30)
143
- counter = sender.create_counter(length)
144
- for i in range(length):
145
- # sync method
146
- sender.to_clients(counter.tick() ,sender.client, wait=True)
142
+ sender.load(data)
147
143
  ```
148
144
 
149
145
  5.3 register handler in channel_mapping
@@ -1,5 +1,5 @@
1
1
  valar/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- valar/apps.py,sha256=OGgsSN7nsa5GEA3kF0EqtY5eFWI5pnuR2tw32cZXmpo,632
2
+ valar/apps.py,sha256=zqmRr7_c0iMtaQ9Wt6vYLFQCObla2n5-fMw5-fgEz-w,581
3
3
  valar/urls.py,sha256=tE_gvrzla_RDza7JOsINssxBmQfm_R-esUpNtwHUkf4,1099
4
4
  valar/channels/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  valar/channels/consumer.py,sha256=fEP52wBHWccturn2QAkqOt9-_Fr8akiw95AoVc6dEMM,1395
@@ -12,9 +12,6 @@ valar/classes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
12
  valar/classes/singleton_meta.py,sha256=aa9DZKG4Q9Cr67ZWrQ0yaFLrEjwFoTMQbDrpoIqgJZs,245
13
13
  valar/classes/valar_minio.py,sha256=20FpP7fbSuKG4cTF0-gmYUvHnPsVvwWOchfljb92o-8,2720
14
14
  valar/classes/valar_response.py,sha256=nwOOjT1AeORkxAIRTrXMPa6-xtMZP7XaLJnHG-yfudA,252
15
- valar/classes/app_mixins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
- valar/classes/app_mixins/auto_migration_mixin.py,sha256=PpqZaIYXMDmlMzfDbmdMNv18T_d7wA8yfVSgU4Qw3uM,337
17
- valar/classes/app_mixins/auto_urlpatterns_mixin.py,sha256=FX-t-TJWawXyS2r6jbj_IrJBpzwMbWzIjyK6PsHL6XE,415
18
15
  valar/dao/__init__.py,sha256=WGjXrnjmgcfOvtTYIVjtdsmh9mlc0IJCrZD2ScZ6Kx0,1335
19
16
  valar/dao/abstract.py,sha256=2M5OLxze-uQDAJIgJtuGKoDjpwVw97Rg_wOeOq6gFTA,2318
20
17
  valar/dao/engine.py,sha256=B41ScN2OqWpPmVX6n6EEqHPfNejCsMhAo4oBNOTOUAQ,2759
@@ -40,8 +37,15 @@ valar/views/file.py,sha256=NxfbxT4EJRDFgXol06kD0vcSp4lN4BCVJ5wq43rh8Yg,1537
40
37
  valar/views/handler.py,sha256=zlJoCnFnXK_2hyTXaNQrwj7svWQJk4ixIldCosIoCpY,1113
41
38
  valar/views/meta.py,sha256=H3_raG-LEcfg1p_CBpluhPXBsLFQB_jtaI5CKGgYOKk,4774
42
39
  valar/views/rest.py,sha256=HnmPR6_Q_NTtotaeDjfwIGwVG7eigtKBXfoaedUgar8,2349
43
- valar-1.2.0.dist-info/licenses/LICENSE,sha256=2bm9uFabQZ3Ykb_SaSU_uUbAj2-htc6WJQmS_65qD00,1073
44
- valar-1.2.0.dist-info/METADATA,sha256=8VwVIvq2k2Ck8ZSJ2t3mfUqWTMLOCgNUt-olqZmaM4k,3431
45
- valar-1.2.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
46
- valar-1.2.0.dist-info/top_level.txt,sha256=TVi6VcvvYfVYZ_WnUVwT4psI8p6inaP3KfmQEWrrvYg,6
47
- valar-1.2.0.dist-info/RECORD,,
40
+ valar-1.2.2.dist-info/licenses/LICENSE,sha256=2bm9uFabQZ3Ykb_SaSU_uUbAj2-htc6WJQmS_65qD00,1073
41
+ vtest/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
+ vtest/apps.py,sha256=Bla5GoyOYUPGg0RMvKf-A4SNE3wUc3MA5C438Nu0sz0,491
43
+ vtest/handlers.py,sha256=VQ9Lv5_zvlPmRjV81mX8QTsncm4bOlSHadBcX33SfxE,404
44
+ vtest/models.py,sha256=2xf9qSVbjj8j8dbSp0vx4SHIBdQAGzbVfsyt7nxKTq4,2567
45
+ vtest/views.py,sha256=o0ElFeXGRkmvtpblitAtGQqhwjnu6NIGiIetLNxdauE,172
46
+ vtest/migrations/0001_initial.py,sha256=l4D-fKYjX8qht95iY5dDpFO6bsz7RQY2mbCWRdvhaGo,9434
47
+ vtest/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
+ valar-1.2.2.dist-info/METADATA,sha256=9ad7MaPQDXWkRmv_4DUAaJJ14PE6rqP_5VehOeqw9wQ,3312
49
+ valar-1.2.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
50
+ valar-1.2.2.dist-info/top_level.txt,sha256=BM6TVgqVM6zSHp9lZmbN46veSedwX0ezelOKL8C6IT4,12
51
+ valar-1.2.2.dist-info/RECORD,,
vtest/apps.py ADDED
@@ -0,0 +1,17 @@
1
+ import os
2
+ from django.apps import AppConfig
3
+
4
+ from valar_app_mixins.auto_migration_mixin import AutoMigrationMixin
5
+
6
+ valar_app = __package__.replace('src.', '')
7
+
8
+
9
+ class VTestConfig(AutoMigrationMixin, AppConfig):
10
+ default_auto_field = 'django.db.models.BigAutoField'
11
+ name = __package__
12
+
13
+ def ready(self):
14
+ if os.environ.get('RUN_MAIN') == 'true':
15
+ from ..valar.dao.frame import MetaFrame
16
+ getattr(super(), 'auto_migrate', None)()
17
+ MetaFrame()
vtest/handlers.py ADDED
@@ -0,0 +1,15 @@
1
+ import time
2
+
3
+ from ..valar.channels.counter import Counter
4
+ from ..valar.channels.sender import ValarChannelSender
5
+
6
+
7
+ def valar_test_handler(sender: ValarChannelSender):
8
+ data = sender.data
9
+ length = data.get('length', 100)
10
+ counter = Counter(length)
11
+ for i in range(length):
12
+ time.sleep(0.1)
13
+ tick = counter.tick()
14
+ tick.update({'name': 'test1'})
15
+ sender.load(tick)
@@ -0,0 +1,155 @@
1
+ # Generated by Django 4.2.23 on 2025-08-28 10:15
2
+
3
+ from django.db import migrations, models
4
+ import django.db.models.deletion
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ initial = True
10
+
11
+ dependencies = [
12
+ ]
13
+
14
+ operations = [
15
+ migrations.CreateModel(
16
+ name='Case',
17
+ fields=[
18
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
19
+ ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
20
+ ('name', models.CharField(max_length=50, null=True)),
21
+ ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
22
+ ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
23
+ ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
24
+ ('saved', models.BooleanField(default=False, verbose_name='已保存')),
25
+ ('a1', models.FloatField(default=0, verbose_name='余额')),
26
+ ('a2', models.FloatField(default=0, verbose_name='已用信用额度')),
27
+ ('a3', models.FloatField(default=0, verbose_name='年还款额')),
28
+ ('a4', models.FloatField(default=0, verbose_name='年收入/年还款')),
29
+ ('a5', models.FloatField(default=0, verbose_name='负债')),
30
+ ('a6', models.FloatField(default=0, verbose_name='利率*期数')),
31
+ ('a7', models.FloatField(default=0, verbose_name='分期付款/年收入')),
32
+ ('a8', models.FloatField(default=0, verbose_name='贷款人均负债')),
33
+ ('a9', models.FloatField(default=0, verbose_name='匿名特征加总')),
34
+ ('a10', models.FloatField(default=0, verbose_name='有效不良记录数')),
35
+ ],
36
+ options={
37
+ 'abstract': False,
38
+ },
39
+ ),
40
+ migrations.CreateModel(
41
+ name='Tree',
42
+ fields=[
43
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
44
+ ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
45
+ ('name', models.CharField(max_length=50, null=True)),
46
+ ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
47
+ ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
48
+ ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
49
+ ('saved', models.BooleanField(default=False, verbose_name='已保存')),
50
+ ('pid', models.IntegerField(default=0, verbose_name='父节点')),
51
+ ('isLeaf', models.BooleanField(default=False, verbose_name='叶子节点')),
52
+ ('icon', models.CharField(max_length=255, null=True, verbose_name='图标')),
53
+ ('text', models.TextField(null=True, verbose_name='text')),
54
+ ],
55
+ options={
56
+ 'verbose_name': '树形测试',
57
+ },
58
+ ),
59
+ migrations.CreateModel(
60
+ name='Vala',
61
+ fields=[
62
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
63
+ ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
64
+ ('name', models.CharField(max_length=50, null=True)),
65
+ ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
66
+ ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
67
+ ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
68
+ ('saved', models.BooleanField(default=False, verbose_name='已保存')),
69
+ ('text_field', models.TextField(null=True, verbose_name='text')),
70
+ ('boolean_field', models.BooleanField(null=True, verbose_name='boolean')),
71
+ ('integer_field', models.IntegerField(null=True, verbose_name='integer')),
72
+ ('float_field', models.FloatField(null=True, verbose_name='float')),
73
+ ('date_field', models.DateField(null=True, verbose_name='date')),
74
+ ('datetime_field', models.DateTimeField(null=True, verbose_name='datetime')),
75
+ ('time_field', models.TimeField(null=True, verbose_name='time')),
76
+ ('json_field', models.JSONField(null=True, verbose_name='json')),
77
+ ('file', models.FileField(null=True, upload_to='', verbose_name='File')),
78
+ ],
79
+ options={
80
+ 'abstract': False,
81
+ },
82
+ ),
83
+ migrations.CreateModel(
84
+ name='O2O',
85
+ fields=[
86
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
87
+ ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
88
+ ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
89
+ ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
90
+ ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
91
+ ('saved', models.BooleanField(default=False, verbose_name='已保存')),
92
+ ('name', models.CharField(max_length=100, null=True, verbose_name='name')),
93
+ ('vala', models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to='vtest.vala', verbose_name='vala')),
94
+ ],
95
+ options={
96
+ 'abstract': False,
97
+ },
98
+ ),
99
+ migrations.CreateModel(
100
+ name='M2O',
101
+ fields=[
102
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
103
+ ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
104
+ ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
105
+ ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
106
+ ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
107
+ ('saved', models.BooleanField(default=False, verbose_name='已保存')),
108
+ ('name', models.CharField(max_length=100, null=True, verbose_name='name')),
109
+ ('vala', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='vtest.vala', verbose_name='vala')),
110
+ ],
111
+ options={
112
+ 'abstract': False,
113
+ },
114
+ ),
115
+ migrations.CreateModel(
116
+ name='M2M',
117
+ fields=[
118
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
119
+ ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
120
+ ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
121
+ ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
122
+ ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
123
+ ('saved', models.BooleanField(default=False, verbose_name='已保存')),
124
+ ('pid', models.IntegerField(default=0, verbose_name='父节点')),
125
+ ('isLeaf', models.BooleanField(default=False, verbose_name='叶子节点')),
126
+ ('icon', models.CharField(max_length=255, null=True, verbose_name='图标')),
127
+ ('name', models.CharField(max_length=100, null=True, verbose_name='name')),
128
+ ('valas', models.ManyToManyField(to='vtest.vala', verbose_name='valas')),
129
+ ],
130
+ options={
131
+ 'abstract': False,
132
+ },
133
+ ),
134
+ migrations.CreateModel(
135
+ name='Forcast',
136
+ fields=[
137
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
138
+ ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
139
+ ('name', models.CharField(max_length=50, null=True)),
140
+ ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
141
+ ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
142
+ ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
143
+ ('saved', models.BooleanField(default=False, verbose_name='已保存')),
144
+ ('type', models.CharField(max_length=100, verbose_name='类别')),
145
+ ('test', models.FloatField(default=0, verbose_name='测试集')),
146
+ ('train', models.FloatField(default=0, verbose_name='训练集')),
147
+ ('varify', models.FloatField(default=0, verbose_name='验证集')),
148
+ ('value', models.FloatField(default=0, verbose_name='预测结果')),
149
+ ('case', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='vtest.case')),
150
+ ],
151
+ options={
152
+ 'abstract': False,
153
+ },
154
+ ),
155
+ ]
File without changes
vtest/models.py ADDED
@@ -0,0 +1,59 @@
1
+ from django.db import models
2
+
3
+ from ..valar.models.core import VModel, VTree
4
+
5
+
6
+ class Case(VModel):
7
+ a1 = models.FloatField(default=0, verbose_name='余额')
8
+ a2 = models.FloatField(default=0, verbose_name='已用信用额度')
9
+ a3 = models.FloatField(default=0, verbose_name='年还款额')
10
+ a4 = models.FloatField(default=0, verbose_name='年收入/年还款')
11
+ a5 = models.FloatField(default=0, verbose_name='负债')
12
+ a6 = models.FloatField(default=0, verbose_name='利率*期数')
13
+ a7 = models.FloatField(default=0, verbose_name='分期付款/年收入')
14
+ a8 = models.FloatField(default=0, verbose_name='贷款人均负债')
15
+ a9 = models.FloatField(default=0, verbose_name='匿名特征加总')
16
+ a10 = models.FloatField(default=0, verbose_name='有效不良记录数')
17
+
18
+
19
+ class Forcast(VModel):
20
+ case = models.ForeignKey(Case, on_delete=models.CASCADE, null=True)
21
+ type = models.CharField(max_length=100, verbose_name='类别')
22
+ test = models.FloatField(default=0, verbose_name='测试集')
23
+ train = models.FloatField(default=0, verbose_name='训练集')
24
+ varify = models.FloatField(default=0, verbose_name='验证集')
25
+ value = models.FloatField(default=0, verbose_name='预测结果')
26
+
27
+
28
+ class Vala(VModel):
29
+ text_field = models.TextField(null=True, verbose_name='text')
30
+ boolean_field = models.BooleanField(null=True, verbose_name='boolean')
31
+ integer_field = models.IntegerField(null=True, verbose_name='integer')
32
+ float_field = models.FloatField(null=True, verbose_name='float')
33
+ date_field = models.DateField(null=True, verbose_name='date')
34
+ datetime_field = models.DateTimeField(null=True, verbose_name='datetime')
35
+ time_field = models.TimeField(null=True, verbose_name='time')
36
+ json_field = models.JSONField(null=True, verbose_name='json')
37
+ file = models.FileField(null=True, verbose_name='File')
38
+
39
+
40
+ class M2O(VModel):
41
+ vala = models.ForeignKey(to=Vala, null=True, on_delete=models.CASCADE, verbose_name='vala')
42
+ name = models.CharField(max_length=100, null=True, verbose_name='name')
43
+
44
+
45
+ class O2O(VModel):
46
+ vala = models.OneToOneField(to=Vala, null=True, on_delete=models.CASCADE, verbose_name='vala')
47
+ name = models.CharField(max_length=100, null=True, verbose_name='name')
48
+
49
+
50
+ class M2M(VTree):
51
+ valas = models.ManyToManyField(to=Vala, verbose_name='valas')
52
+ name = models.CharField(max_length=100, null=True, verbose_name='name')
53
+
54
+
55
+ class Tree(VTree):
56
+ text = models.TextField(null=True, verbose_name='text')
57
+
58
+ class Meta:
59
+ verbose_name = '树形测试'
vtest/views.py ADDED
@@ -0,0 +1,8 @@
1
+ import json
2
+
3
+ from ..valar.classes.valar_response import ValarResponse
4
+
5
+
6
+ def valar_test_request(request):
7
+ body = json.loads(request.body)
8
+ return ValarResponse(body)
@@ -1,8 +0,0 @@
1
- class AutoMigrationMixin:
2
- name = None # 子类必须提供
3
- def auto_migrate(self):
4
- from django.core.management import call_command
5
- app = self.name.replace('src.','')
6
- call_command('makemigrations', app, interactive=False, verbosity=0)
7
- call_command('migrate', app, interactive=False, verbosity=0)
8
-
@@ -1,15 +0,0 @@
1
- import importlib
2
-
3
- from django.conf import settings
4
- from django.urls import path, include
5
-
6
-
7
- class AutoUrlPatternsMixin:
8
- name = None # 子类必须提供
9
-
10
- def set_url(self):
11
- root = settings.ROOT_URLCONF
12
- module = importlib.import_module(root)
13
- urlpatterns: list = getattr(module, 'urlpatterns')
14
- url = f'{self.name}.urls'
15
- urlpatterns.append(path('valar/', include(url)))
File without changes
File without changes