我遇到错误 .models导入分支中的文件“ D:\ DjangoProjects \ StudentExam \ website \ Student \ validators.py”,第2行
ImportError:无法从'Student.models'(D:\ DjangoProjects \ StudentExam \ website \ Student \ models.py)导入名称“分支”
对于语句“ 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
validators.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")
答案 0 :(得分:0)
简短答案:改用 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 Style Guidelines,建议使用 lowercase_with_underscores
命名属性,因此,branch_id
代替 。branchId
此外,将主键命名为id
以外的其他名称通常没有任何意义。通过在其前面加上branch_id
,您可以减少鸭子键入的使用。因此最好完全省略该字段,例如documentation on Automatic primary key fields says:
默认情况下, Django为每个模型提供以下字段:
id = models.AutoField(primary_key=True)
这是一个自动递增的主键。
如果您想指定自定义主键,只需指定
primary_key=True
放在您的其中一个字段上。如果Django看到您已经 明确设置Field.primary_key
,它不会添加自动id
列。
因此,除非您有充分的理由自行指定,否则您可以只列出数据列:
class Branch(models.Model):
# ...
# other non-pk fields