Django не сохраняет сразу при новой записи строки?

У меня есть проект 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)

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

ПРИМЕЧАНИЕ

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

ПРИМЕЧАНИЕ

При этом:

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

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

Вы специально создаете это поле id? Если у вас есть поле ID, отличное от AutoField, вам нужно указать их значения вручную.

AKX 17.12.2018 16:48

Да, но я не осознавал, что не ставил id = models.AutoField(primary_key=True). Решил проблему. Дайте ответ, и я приму.

alphazwest 17.12.2018 16:58

Сделанный. Рад помочь!

AKX 17.12.2018 16:59
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
44
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Вы были правы, хотя это была просто ошибка с моей стороны. models были импортированы, и URL обозначался как models.URL. Я обновил вопрос, чтобы отразить это, хотя проблема была, как указал @AKX.

alphazwest 17.12.2018 17:03
Ответ принят как подходящий

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

id = models.IntegerField(primary_key=True)

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

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

Другие вопросы по теме