在验证器文件中导入模型时,Django中的模型导入错误

时间:2019-06-05 20:32:53

标签: python django-models

我遇到错误 .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")

1 个答案:

答案 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