【问题标题】:django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, but settings are not configureddjango.core.exceptions.ImproperlyConfigured:请求设置 INSTALLED_APPS,但未配置设置
【发布时间】:2020-04-12 20:29:05
【问题描述】:

我正在尝试使用 Faker 在我的模态中填充数据 但我得到了错误。 这是我的代码

import os
from faker import Faker
from first_app.models import Topic, Webpage, AccessRecord

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myfirst.settings')
import django
django.setup()
import random

fakegen = Faker()
topics = ['search', 'Social', 'Marketplace', 'News', 'Games']


def add_topic():
    t = Topic.objects.get_or_create(top_name=random.choice(topics))[0]
    t.save()
    return t

def populate(N=5):
    for entry in range(N):
        top=add_topic()
        fake_url=fakegen.url()
        fake_date=fakegen.date()
        fake_name=fakegen.company()

        webpg=Webpage.objects.get_or_create(topic=top,url=fake_url,name=fake_name)[0]

        acc_rec=AccessRecord.objects.get_or_create(name=webpg,date=fake_date)[0]

if __name__=='__main__':
    print('populating script')
    populate(30)
    print('Completed')

我认为错误是由于这一行

os.environ.setdefault

但是当我评论这一行时,它不会填充数据

下面是错误

django.core.exceptions.ImproperlyConfigured:请求设置 INSTALLED_APPS,但未配置设置。您必须定义环境变量 DJA NGO_SETTINGS_MODULE 或在访问设置之前调用 settings.configure()。

【问题讨论】:

    标签: python django django-3.0


    【解决方案1】:

    您应该在导入模型之前致电django.setup()

    import os
    import random
    from faker import Faker
    
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myfirst.settings')
    import django
    django.setup()
    
    from first_app.models import Topic, Webpage, AccessRecord
    
    #...
    

    【讨论】:

    • import os from faker import Faker from first_app.models import Topic, Webpage, AccessRecord import django import random django.setup() os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myfirst.settings')
    • 所以您没有更改订单? from first_app.models import ... 应该在这三行之后(再次检查答案)。
    • import django django.setup() from first_app.models import Topic, Webpage, AccessRecord os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myfirst.settings') 喜欢这个?
    • 不,os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myfirst.settings') 应该在 from first_app.models import Topic... 之前。 (检查答案中的顺序)。基本上,您应该让 django 知道您的设置,以便它可以识别您的应用程序,从而识别您的模型。
    【解决方案2】:

    我最近遇到了一个非常相似的错误

    ERROR project/tests/test_models.py - django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, but settings are no...
    ERROR project/tests/test_priced_offers.py - django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, but settings...
    

    发生这种情况,因为我在根文件夹中运行 pytest,而不是在项目文件夹中。当我在项目文件夹中执行测试时,错误消失了。

    希望这对某人有帮助!

    【讨论】:

      【解决方案3】:

      我刚刚调试了populate.py文件,发现我在配置Django之前导入了models.py,所以首先你需要设置环境,然后你需要设置Django,最后你可以在populate.py文件中导入模型。

      from faker import Faker
      import random
      import django
      import os
      
      # Configure settings for project
      # Need to run this before calling models from application!
      os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'first_model.settings') # this should be done first.
      
      # Import settings
      django.setup() # This needs to be done after you set the environ
      
      from first_app.models import Topic, WebPage, AccessRecord # At last you can import models in populate.py file
      
      
      fakegen = Faker()
      topics = ['Search', 'Social', 'Marketplace', 'News', 'Games']
      
      
      def add_topic():
          t = Topic.objects.get_or_create(top_name=random.choice(topics))[0]
          t.save()
          return t
      
      
      def populate(N=5):
          '''
          Create N Entries of Dates Accessed
          '''
      
          for entry in range(N):
      
              # Get Topic for Entry
              top = add_topic()
      
              # Create Fake Data for entry
              fake_url = fakegen.url()
              fake_date = fakegen.date()
              fake_name = fakegen.company()
      
              # Create new Webpage Entry
              webpg = WebPage.objects.get_or_create(
                  topic=top, name=fake_name, url=fake_url,)[0]
      
              # Create Fake Access Record for that page
              # Could add more of these if you wanted...
              accRec = AccessRecord.objects.get_or_create(
                  name=webpg, date=fake_date)[0]
      
      
      if __name__ == '__main__':
          print("Populating the databases...Please Wait")
          populate(20)
          print('Populating Complete')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-25
        • 2020-09-27
        • 2018-10-09
        • 2018-05-21
        • 2015-04-16
        • 2021-08-07
        • 2019-12-02
        • 2020-03-07
        相关资源
        最近更新 更多