Джанго не экономит сразу на записи новой строки? - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть проект django, настроенный следующим образом:

myapp.models.py

from django.db import models

class BaseModel(models.Model):
    id = models.IntegerField(primary_key=True)
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True

class Source(BaseModel):
    name = models.CharField(max_length=32, unique=True)
    base_url = models.ForeignKey('URL', on_delete=models.CASCADE)

class URL(BaseModel):
    url = models.TextField(max_length=512, unique=True)
    url_source = models.ForeignKey('Source', on_delete=models.CASCADE, null=True, blank=True)

В отдельном файле functions.py у меня есть следующий скрипт, которыйпредназначен для заполнения базы данных некоторыми начальными известными данными, на которые будут ссылаться все новые данные.то есть индексирование неизвестного номера и целевых URL ссылок, найденных на ряде известных Source веб-сайтов.

functions.py

# Create non-runtime db access
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "MY_PROJECT.settings")
import django
django.setup()

from MYAPP import models

sources = {
        'website-one': {'base_url': 'https://www.website-one.com'},
        'website-two': {'base_url': 'https://www.website-two.com'},
        'website-three': {'base_url': 'https://www.website-three.com'},
    }
    for name, meta in sources.items():

        new_url = models.URL.objects.create(url=meta['base_url'])

        print(new_url.id)

При запуске функция print возвращает None, None, None, которые я интерпретирую как означающие, что новые URL объекты не были сохранены.После проверки базы данных я вижу, что каждый объект успешно создан и имеет поле id, как и ожидалось.

Я собираюсь использовать это:

new_url = models.URL.objects.create(url=meta['base_url'])

Чтобы добавитьссылка на новый Source в следующей строке:

new_source = models.Source.objects.create(name=name, base_url=new_url)

Почему это не работает?

NOTE

Послескрипт запускается, я вижу в базе данных, что все новые URL объекты были зафиксированы и имеют id поля, назначенные должным образом, хотя на них нельзя немедленно ссылаться в скрипте (проблема.)

ПРИМЕЧАНИЕ

При этом:

new_url = models.URL.objects.create(url=meta['base_url'])
new_url.save()

Я получаю ошибку django.db.utils.IntegrityError: UNIQUE constraint failed, которая, по-видимому, указывает на то, что запись для нового URL существует.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

В настоящее время у вас есть

id = models.IntegerField(primary_key=True)

в базовой модели.

Если у вас есть поле, отличное от идентификатора AutoField, вам нужно будет указать их значения вручную.

0 голосов
/ 17 декабря 2018

вы не импортировали свою модель URL в functions.py

...