У меня есть проект 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 = models.AutoField(primary_key=True)
. Решил проблему. Дайте ответ, и я приму.
Сделанный. Рад помочь!
вы не импортировали свою модель URL в functions.py
Вы были правы, хотя это была просто ошибка с моей стороны. models
были импортированы, и URL
обозначался как models.URL
. Я обновил вопрос, чтобы отразить это, хотя проблема была, как указал @AKX.
В настоящее время у вас есть
id = models.IntegerField(primary_key=True)
в базовой модели.
Если у вас есть поле ID, отличное от AutoField, вам нужно указать их значения вручную.
Вы специально создаете это поле
id
? Если у вас есть поле ID, отличное от AutoField, вам нужно указать их значения вручную.