我从.models import Branch中收到第2行的错误文件“ D:\ DjangoProjects \ StudentExam \ website \ Student \ validators.py”
ImportError:无法从“ Student.models”(D:\ DjangoProjects \ StudentExam \ website \ Student \ models.py)导入名称“ Branch”
对于语句“ from .models import Branch”,写在validators.py文件中。即使这两个文件都在同一个应用程序中,也会出现错误。我不明白怎么了。
我什至尝试了“从Student.models / website.models导入分支”,但是它显示了未解决的参考分支。
目录结构如下:
StudentExam
-venv
-website
-Student
-migrations
-__init__.py
-admin.py
-apps.py
-models.py
-tests.py
-urls.py
-validators.py
-views.py
-website
-__init__.py
-settings.py
-urls.py
-wsgi.py
-db.sqlite3
-manage.py
validateators.py:-
from django.core.exceptions import ValidationError
from .models import Branch
def increment_id():
last_branch_id = Branch.objects.all().order_by('id').last()
new_branch_id = last_branch_id + 1
return new_branch_id
models.py:-
from django.db import models
from .validators import validate_sem,cie_out_of,ese_out_of,increment_id
class Branch(models.Model):
branchID = models.PositiveSmallIntegerField(primary_key = True, serialize = True, validators = increment_id())
branchName = models.CharField(max_length = 30)
objects = models.Manager()
def __str__(self):
return ', '.join('{} = {}'.format(key, value) for key, value in self.__dict__.items() if key != "_state")
简短的答案:使用它AutoField
,或者根本不指定主键:Django将自动构造一个名为的主键id
。
您可以在此处进行循环导入:models
模块取决于您的模块validators
,反之亦然。
不过,您可以models
通过将其导入来延迟加载模块increment_id
:
# app/validators.py
from django.core.exceptions import ValidationError
def increment_id():
from .models import Branch
last_branch_id = Branch.objects.all().order_by('BranchId').last().BranchId
new_branch_id = last_branch_id + 1
return new_branch_id
然后,您可以在模型中使用:
# app/models.py
class Branch(models.Model):
branchID = models.PositiveSmallIntegerField(primary_key=True, serialize=True, default=increment_id)
但是请注意,这不是验证器,这里有一个默认值。此外,您不必这样写:Django有一个AutoField
[Django-doc]:
一个IntegerField,它根据可用的ID自动递增。您通常不需要直接使用它;如果没有另外指定,主键字段将自动添加到模型中。请参阅自动主键字段。
因此,您可以更好地将其定义为:
class Branch(models.Model):
branch_id = models.AutoField(primary_key=True)
# ...
按照PEP-8风格指南是进一步可取的名字与属性lowercase_with_underscores
,所以branch_id
代替。branchId
此外,将主键命名为,通常没有任何意义id
。通过加上前缀branch_id
,可以减少使用鸭子的类型。因此,它可能会更好省略的那场完全地,作为对文档自动主键字段说:
默认情况下,Django为每个模型提供以下字段:
id = models.AutoField(primary_key=True)
这是一个自动递增的主键。
如果您想指定自定义主键,只需
primary_key=True
在您的一个字段中指定即可。如果Django看到您已明确设置Field.primary_key
,它不会添加自动id
列。
因此,除非您有充分的理由自行指定,否则可以只列出数据列:
class Branch(models.Model):
# ...
# other non-pk fields
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句