не может предварительно заполнить базу данных Django - PullRequest
0 голосов
/ 30 ноября 2018

, поэтому я следовал этому руководству из 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)

Ответы [ 2 ]

0 голосов
/ 31 июля 2019

сначала нужно сделать python manage.py migrate

, а затем соответственно python manage.py makemigrations

, а затем дать какое-то предположение, подобное этому ... AccessRecort изменить на AccessRecord [y / N]?нажмите y

, затем python mange.py migrate

Операции, которые необходимо выполнить: применить все миграции: admin, auth, contenttypes, first_app, сессий Запуск миграций: применение first_app.0002_auto_20190731_1445 ... OK

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

Заполнение скрипта!

Заполнение завершено!

0 голосов
/ 30 ноября 2018

Не совсем ясно, в чем заключается ваша проблема без сообщения об ошибке, но я догадываюсь, что вы не можете загрузить среду Django в своем автономном скрипте.

У Django есть специальная возможность для сборки "«Команды», которые можно запускать в среде Django, без необходимости «настраивать» их, как это делается в populate_first_app.py.

Документация Django для пользовательских команд

В приведенном выше примере вы бы хотели переместить "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 help

...