【问题标题】:How to import Django app from another app in same project?如何从同一项目中的另一个应用程序导入 Django 应用程序?
【发布时间】:2023-03-10 05:04:01
【问题描述】:

尽管同样的问题在 Stackoverflow 上已经出现了 20 次,但没有一个能准确说明实际问题是什么。

我的 Django 项目中很少有 Django 应用程序,但是当我尝试将模型从一个应用程序导入到另一个应用程序时,它没有导入。我厌倦了通过以下方式解决问题,但没有运气:

backend
├── realtors
│   ├── __pycache__
│   ├── migrations
│   ├── __init__.py
│   ├── admin.py
│   ├── app.py
│   ├── models.py
│   ├── serializers.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── listings
│   ├── __pycache__
│   ├── migrations
│   ├── __init__.py
│   ├── admin.py
│   ├── app.py
│   ├── models.py
│   ├── serializers.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── accounts
│   ├── __pycache__
│   ├── migrations
│   ├── __init__.py
│   ├── admin.py
│   ├── app.py
│   ├── models.py
│   ├── serializers.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── manage.py
├── requirements.txt.
└── realest-estate
    ├── asgi.py
    ├── __init__.py
    ├── __pycache__
    ├── settings.py
    ├── urls.py
    └── wsgi.py

litings.models

from django.db import models
from realtors.models import Realtors



class Listing(models.Model):
    class SaleType(models.TextChoices):
        FOR_SALE = 'For Sales'
        FOR_RENT = 'For Rent'

    class HomeType(models.TextChoices):
        HOUSE = 'House'
        CONDO = 'Condo'
        TOWNHOUSE = 'Townhouse'

    realtor = models.ForeignKey(Realtors, on_delete=models.DO_NOTHING)

realtors.models

from django.db import models
from datetime import datetime


class Realtors(models.Model):
    name = models.CharField(max_length=50)
    photo = models.ImageField(upload_to='photo/%Y/%m/%d/')
    description = models.TextField(blank=True)
    phone = models.CharField(max_length=20)
    email = models.CharField(max_length=50)
    top_seller = models.BooleanField(default=False)
    date_hired = models.DateTimeField(default=datetime.now, blank=True)

    def __str__(self):
        return self.name

我也尝试通过以下方式导入模型,但运气不佳:

1-)
from django.apps import apps
model = apps.get_model('realtors', 'Realtors')

2-)
from backend.realtors.models import Realtors

[这里是终端和模型文件中未导入错误的屏幕截图]1

注意:我没有使用 pyCharam,当我通过打印(BASE_DIR)在我的 settings.py 中打印出我的根目录时,它给出了完全相同的路径,它作为根 C:... /.../后端 最相关的 Stakoverflow 问题也是:How to import models from one app to another app in Django?

有什么帮助吗?我被困了好几天! :(

【问题讨论】:

  • 应用运行正常吗?可以在manage.py. shell 中加载模型吗?只是想知道是否只有编辑器在报告问题。
  • @MatthewHegarty 感谢您的回复:问题不在于导入模块,实际上是文本编辑器造成了所有麻烦。实际问题在其他地方,在views.py 中。我正在向 SearchView 发送一个 POST 请求,它没有响应 HTTPResponse 而是一些 类。 Idk,问题出在哪里。

标签: django-models python-import importerror django-import-export


【解决方案1】:

在上述问题中,文本编辑器造成了所有导入问题。该应用现在正在从另一个应用导入模块。

但在我的屏幕截图中,终端显示错误:

assert isinstance(response, HttpResponseBase), ( AssertionError:预期从视图返回 ResponseHttpResponseHttpStreamingResponse,但收到 <class 'NoneType'>

在某种程度上与我的 Listings/views.py 模块有关。

&这里是views.py

from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.generics import RetrieveAPIView, ListAPIView
from rest_framework import permissions
from .models import Listing
from .serializer import ListingSerializer, ListingDetailSerializer
from datetime import datetime, timezone, timedelta


class ListingsView(ListAPIView):
    queryset = Listing.objects.order_by(
        '-list_date').filter(is_published=True)
    permission_classes = (permissions.AllowAny, )
    serializer_class = ListingSerializer
    lookup_field = 'slug'


class ListingView(RetrieveAPIView):
    queryset = Listing.objects.order_by('-list_date').filter(is_published=True)
    serializer_class = ListingDetailSerializer
    lookup_field = 'slug'


class SearchView(APIView):
    permission_classes = (permissions.AllowAny, )
    serializer_class = ListingSerializer

    def post(self, request, format=None):
        queryset = Listing.objects.order_by(
            '-list_date').filter(is_published=True)

        data = self.request.data

        sale_type = data['sale_type']
        queryset = queryset.filter(sale_type__iexact=sale_type)

        price = data['price']
        if price == '$0+':
            price = 0
        elif price == '$200,000+':
            price = 200000
        elif price == '$400,000+':
            price = 400000
        elif price == '$600,000+':
            price = 600000
        elif price == '$800,000+':
            price = 800000
        elif price == '$1,000,000+':
            price = 1000000
        elif price == '$1,500,000+':
            price = 1500000
        elif price == 'Any':
            price = -1

        if price != -1:
            queryset = queryset.filter(price__gte=price)

        badrooms = data['badrooms']
        if badrooms == '0+':
            badrooms = 0
        elif badrooms == '1+':
            badrooms = 1
        elif badrooms == '2+':
            badrooms = 2
        elif badrooms == '3+':
            badrooms = 3
        elif badrooms == '4+':
            badrooms = 4
        elif badrooms == '5+':
            badrooms = 5

        queryset = queryset.filter(badrooms__gte=badrooms)

        home_type = data['home_type']
        queryset = queryset.filter(home_type__iexact=home_type)

        bathrooms = data['bathrooms']
        if bathrooms == '0+':
            bathrooms = 0.0
        elif bathrooms == '1+':
            bathrooms = 1.0
        elif bathrooms == '2+':
            bathrooms = 2.0
        elif bathrooms == '3+':
            bathrooms = 3.0
        elif bathrooms == '4+':
            bathrooms = 4.0
        elif bathrooms == '5+':
            bathrooms = 5.0

        queryset = queryset.filter(bathrooms__gte=bathrooms)

        sqft = data['sqft']
        if sqft == '1000+':
            sqft = 1000
        elif sqft == '1200+':
            sqft = 1200
        elif sqft == '1500+':
            sqft = 1500
        elif sqft == '2000+':
            sqft = 2000
        elif sqft == 'Any':
            sqft = 0

        if sqft != 0:
            queryset = queryset.filter(sqft__gte=sqft)

        days_passed = data['days_listed']
        if days_passed == '1 or less':
            days_passed = 1
        elif days_passed == '2 or less':
            days_passed = 2
        elif days_passed == '5 or less':
            days_passed = 5
        elif days_passed == '10 or less':
            days_passed = 10
        elif days_passed == '15 or less':
            days_passed = 15
        elif days_passed == '20 or less':
            days_passed = 20
        elif days_passed == 'Any':
            days_passed = 0

        for query in queryset:
            num_days = (datetime.now(timezone.utc) - query.list_date).days

            if days_passed != 0:
                if num_days > days_passed:
                    slug = query.slug
                    queryset = queryset.exclude(slug__iexact=slug)

        has_photos = data['has_photos']
        if has_photos == '1+':
            has_photos = 1
        elif has_photos == '3+':
            has_photos = 3
        elif has_photos == '5+':
            has_photos = 5
        elif has_photos == '10+':
            has_photos = 10
        elif has_photos == '15+':
            has_photos = 15

        for query in queryset:
            count = 0
            if query.photo_1:
                count += 1
            if query.photo_2:
                count += 1
            if query.photo_3:
                count += 1
            if query.photo_4:
                count += 1
            if query.photo_5:
                count += 1
            if query.photo_6:
                count += 1
            if query.photo_7:
                count += 1
            if query.photo_8:
                count += 1
            if query.photo_9:
                count += 1
            if query.photo_10:
                count += 1
            if query.photo_11:
                count += 1
            if query.photo_12:
                count += 1
            if query.photo_13:
                count += 1
            if query.photo_14:
                count += 1
            if query.photo_15:
                count += 1
            if query.photo_16:
                count += 1
            if query.photo_17:
                count += 1
            if query.photo_18:
                count += 1
            if query.photo_19:
                count += 1
            if query.photo_20:
                count += 1

            if count < has_photos:
                slug = query.slug
                queryset = queryset.exclude(slug__iexact=slug)

            open_house = data['open_house']
            queryset = queryset.filter(open_house__iexact=open_house)

            keywords = data['keywords']
            queryset = queryset.filter(description__icontains=keywords)

            serializer = ListingSerializer(queryset, many=True)

            return Response(serializer.data)

【讨论】:

  • 请您作为一个单独的问题发布 - 您更有可能以这种方式获得回复
【解决方案2】:
form realtors.models import Realtors

确保您的应用已在 INSATLLED_APPS 下的 settings.py 中注册

【讨论】:

  • 感谢您的回答,但是应用名称安装在 settungs.py 中的 INSATLLED_APPS 下。
  • form realtors.models import Realtors 工作了吗?
  • 是的,它现在可以正常工作了。经典错误,我忘记了缩进。感谢您的回复!
猜你喜欢
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多