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

里佳佳

我从.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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章