开发者问题收集

Django 没有在新行条目上立即保存?

2018-12-17
67

我有一个设置如下的 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 文件中,我有以下脚本,该脚本旨在用一些初始 已知 数据填充数据库,所有新数据都将引用这些数据。即索引从多个已知 Source 网站中找到的未知数量和目标 URL 链接。

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 函数返回 NoneNoneNone ,我将其解释为新的 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 约束失败 错误似乎表明新 URL 的条目确实存在。

2个回答

您目前在基础模型中有

id = models.IntegerField(primary_key=True)

如果您有非 AutoField ID 字段,则需要手动指定它们的值。

AKX
2018-12-17

你没有在 functions.py 中导入你的 URL 模型

Danijel Popović
2018-12-17