【问题标题】:can't pre-populate a django database无法预填充 django 数据库
【发布时间】:2019-05-02 23:39:24
【问题描述】:

所以我一直在遵循 Django 1.1 中的本指南,但我实际上使用 Django 2 来预填充 Django 数据库我使用的是 SQLite 数据库,这是我使用 Faker 库的代码,但它不会当我想在 CMD 中运行它时运行。如果可以,请帮助我:

这是我的第一个文件,它是用于填充数据库的脚本: (populate_first_app.py)

import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'first_project.settings')

import django
django.setup()

## FAKE POPULATION SCRIPT:

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

# Creating a fake generator:
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):

    # GET THE TOPIC FOR THE ENTRY:
    top = add_topic()

    # Create the fake data for that entry:
    fake_url = fakegen.url()
    fake_date = fakegen.date()
    fake_name = fakegen.company()

    # Create the new webpage entry:
    webpg = Webpage.objects.get_or_create(topic = top, url = fake_url, name = fake_name)[0]

    # Create a fake access record for that webpage
    acc_rec = AccessRecord.get_or_create(name = webpg, date = fake_date)[0]

    if __name__ == '__main__':
        print("Populating Script!")
        populate(20)
        print("Populating Complete!")

最后,这是我在这个项目中唯一的应用程序的 models.py 文件:

    from django.db import models

class Topic(models.Model):
    top_name = models.CharField(max_length = 255, unique = True)


    def __str__(self):
        return self.top_name

class Webpage(models.Model):
    # A Foreign key is grabbed from another table
    topic = models.ForeignKey(Topic, on_delete=None)
    name = models.CharField(max_length=264, unique=True)
    url = models.URLField(unique=True)

    def __str__(self):
        return self.name

class AccessRecord(models.Model):
    name = models.ForeignKey(Webpage, on_delete=None)
    date = models.DateField()

    def __str__(self):
        # we cast it into string because self.date is a date object
        return str(self.date)

【问题讨论】:

  • 错误是什么?哪个指南?
  • 没有错误,它只是没有运行,也没有错误我想知道这是否与安全有关。这是我从网站上购买的视频指南,但我在他使用 Django 1.1 的问题中提到它已经过时了
  • 没有足够的信息来判断出了什么问题,并且这段代码中没有任何 Django 2 特定的内容。至少修复代码缩进。确保if __name__ == '__main__': 没有缩进。
  • @Alireza - 你可以考虑为这个初始数据创建一个data migration。然后,当您运行 python manage.py migrate 时,数据库表将被填充

标签: python django python-3.x django-models faker


【解决方案1】:

如果没有错误消息,还不清楚您的问题是什么,但我的直觉是您无法在独立脚本中引导 Django 环境。

Django 有一个特殊的工具来构建可以在 Django 环境中运行的“命令”,而无需像在 populate_first_app.py 中那样“设置”。

Django Documentation for Custom Commands

在上面的示例中,您希望将“populate_first_app.py”移动到“first_app/management/commands/populate_first_app.py”。然后你需要把你的函数放在 BaseCommand 中:

from django.core.management.base import BaseCommand, CommandError
from polls.models import Question as Poll
# .. other imports
class Command(BaseCommand):
   help = 'Populates test data in first_app'

   def add_arguments(self, parser):
      parser.add_argument('n', type=int)

   def handle(self, *args, **options):
      fakegen = Faker()
      for entry in range(args.n):
          #.. generate each entry

一旦你有了这个命令,你就可以从 manage.py 运行它:

manage.py populate_first_app -n 20

好处是当别人想用这个的时候,跑起来就可以看到

manage.py 帮助

【讨论】:

  • 所以我已经解决了,但这次我遇到了错误!这是一个导入错误,说 can't import 'Faker' from 'faker' !
  • 你是如何安装“faker”的?你是用“pip install faker”做的吗?
【解决方案2】:

首先你需要做python manage.py migrate

然后分别python manage.py makemigrations

然后给出一些类似的建议... AccessRecort 更改为 AccessRecord [y/N]? 按y

然后python mange.py migrate

要执行的操作:应用所有迁移:admin、auth、 contenttypes, first_app, sessions 运行迁移:应用 first_app.0002_auto_20190731_1445...好的

(MyDjangoEnv) C:\your\file\path\first_project>python populate_first_app.py

填充脚本!

填充完成!

【讨论】:

    【解决方案3】:

    我确实浏览了您的代码,发现了 Django 不创建虚假数据的问题。 您已经在“populate_first_app.py”中缩进了 ma​​in 函数。删除缩进,您的代码应该可以正常工作。

    【讨论】:

      【解决方案4】:

      如果语句缩进错误,没有别的

      import os
      os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'first_project.settings')
      
      import django
      django.setup()
      
      ## FAKE POPULATION SCRIPT:
      
      import random
      from first_app.models import AccessRecord,Webpage,Topic
      from faker import Faker
      
      # Creating a fake generator:
      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):
      
          # GET THE TOPIC FOR THE ENTRY:
          top = add_topic()
      
          # Create the fake data for that entry:
          fake_url = fakegen.url()
          fake_date = fakegen.date()
          fake_name = fakegen.company()
      
          # Create the new webpage entry:
          webpg = Webpage.objects.get_or_create(topic = top, url = fake_url, name = fake_name)[0]
      
          # Create a fake access record for that webpage
          acc_rec = AccessRecord.get_or_create(name = webpg, date = fake_date)[0]
      
      if __name__ == '__main__':
         print("Populating Script!")
         populate(20)
         print("Populating Complete!")
      

      【讨论】:

        猜你喜欢
        • 2013-06-06
        • 1970-01-01
        • 2012-08-14
        • 1970-01-01
        • 2021-02-01
        • 1970-01-01
        • 2011-04-15
        • 2021-01-26
        • 2014-04-10
        相关资源
        最近更新 更多