为什么导入模型不能在同一目录的实用程序文件中工作?

时间:2019-06-26 20:26:24

标签: django

从views.py中,我正在调用位于同一目录(utils.py)中另一个文件中的函数。 utils.py错误,因为它无法从同一目录中的models.py导入模型。

我收到以下错误:

文件“ /home/myuser/site/core/utils.py”,第1行,在 2019-06-26 15:22:46,645:来自.models import( 2019-06-26 15:22:46,645:******************************************* ************ 2019-06-26 15:22:46,646:如果您看到导入错误并且不知道为什么, 2019-06-26 15:22:46,646:我们有专门的帮助页面来帮助您调试: 2019-06-26 15:22:46,646:https://help.pythonanywhere.com/pages/DebuggingImportError/ 2019-06-26 15:22:46,646:******************************************* ************ 2019-06-26 15:22:51,962:运行WSGI应用程序时出错 2019-06-26 15:22:51,963:ImportError:无法导入名称'电影'

utils.py

1: for a and b --> both over 21,000 and a >= b
2: for c
3: for b and d

views.py

from .models import(
    Movie,
    Album,
    Book)

def get_weekly_tops():
    start_date, end_date = getThisWeekStartEnd()

    book = Book.objects.filter(release_date__range=[start_date, end_date]).filter(active=True).order_by('-amazon_rating')[:1]
    theater = Movie.objects.filter(release_date__range=[start_date, end_date]).filter(active=True).filter(bluray_date__isnull=True).order_by('-imdb_rating')[:1]
    bluray = Movie.objects.filter(bluray_date__range=[start_date, end_date]).filter(active=True).filter(bluray_date__isnull=False).order_by('-imdb_rating')[:1]
    album = Album.objects.filter(release_date__range=[start_date, end_date]).filter(active=True).order_by('-base_rating')[:1]

    if len(book) == 0:
        book = Book.objects.filter(release_date__range=[start_date + timedelta(days=-6), end_date + timedelta(days=-6)]).filter(active=True).order_by('-amazon_rating')[:1]

    if len(theater) == 0:
        theater = Movie.objects.filter(release_date__range=[start_date + timedelta(days=-6), end_date + timedelta(days=-6)]).filter(active=True).filter(bluray_date__isnull=True).order_by('-imdb_rating')[:1]

    if len(bluray) == 0:
        bluray = Movie.objects.filter(bluray_date__range=[start_date + timedelta(days=-6), end_date + timedelta(days=-6)]).filter(active=True).filter(bluray_date__isnull=False).order_by('-imdb_rating')[:1]

    if len(album) == 0:
        album = Album.objects.filter(release_date__range=[start_date + timedelta(days=-6), end_date + timedelta(days=-6)]).filter(active=True).order_by('-base_rating')[:1]

    return {'book':book, 'theater':theater, 'bluray':bluray, 'album':album}

models.py

from .utils import(
    get_weekly_tops)

def index(request):
    weekly_tops = get_weekly_tops()

    return render(
        request,
        'index.html',
        context={
            'weekly_tops':weekly_tops
        },
    )

2 个答案:

答案 0 :(得分:1)

您的问题是models.pyutils.py之间的循环导入。发生了什么事:

  1. utils.pyMovie导入models.py
  2. models.py在定义utils.py类之前先导入Movie。。
  3. utils.py因此无法从Movie导入models,因为utils是在models存在之前从Movie导入的。

就修复而言,您可以:

  1. 重组utils.py,以便将models.py所需的内容分离到另一个模块中。

  2. 从使用函数的任何函数中导入utils.py方法。

例如,

def foo():
    from .utils import unique_slug_generator 

    slug = unique_slug_generator()

答案 1 :(得分:0)

我认为问题在于您正在运行代码而不是调用

python manage.py runserver

运行代码时,从其他文件的导入似乎不起作用。我不确定为什么吗?只需运行服务器,而不是运行python文件。