【发布时间】:2014-09-06 06:46:21
【问题描述】:
这个问题有一些限制。我们目前使用带有实时虚拟机统计信息的生产数据库。我们正在尝试创建一个 django 界面,该界面与我们希望管理员能够编辑的表进行交互。因此,迁移是不可能的,因为除非我理解迁移错误,否则它将影响当前的数据库结构和/或数据。
我在我的 models.py 文件中完全匹配了数据库结构。但是我遇到了一些问题。我遇到的一个问题是当我尝试在管理控制面板下添加一个新项目时,它会给我一个完整性错误,因为它试图为我设置为主键的字段插入一个空值models.py 文件。
我们目前正在使用 oracle 数据库。
我的 Models.py 不是全部,而是其中的一个示例。
class License(models.Model):
license_id = models.AutoField(primary_key = True, editable = False, db_column='license_id')
license_authority_id = models.ForeignKey(License_authoritie, on_delete = models.PROTECT, db_column='license_authority_id')
product = models.CharField(max_length = 20)
class Meta:
managed = False
db_table = 'licenses'
ordering = ['product']
def __unicode__(self): # Python 3: def __str__(self):
return self.product
class Vm_license(models.Model):
vm_license_id = models.AutoField(primary_key = True, db_column='vm_license_id')
vm_id = models.ForeignKey(Vm, on_delete = models.PROTECT, db_column='vm_id')
license = models.ManyToManyField(License)
class Meta:
managed = False
db_table = 'vm_licenses'
我得到的错误:
Request Method: POST
Request URL: http://127.0.0.1:8000/admin/portal/vm_license/add/
Django Version: 1.6.5
Exception Type: IntegrityError
Exception Value:
ORA-01400: cannot insert NULL into ("DEV"."VM_LICENSES"."VM_LICENSE_ID")
除此之外,我还遇到了另一个问题。
对于这两个表,在管理面板的 vm_licenses 部分下,该表包含所有 VM 及其分配的许可证。我需要能够在管理面板的添加部分下为每个 vm_id 一次选择多个许可证,但我不太确定如何执行此操作。
admin.py 代码
class vm_license_admin(admin.ModelAdmin):
#list_display = ('vm_id', 'license_id')
list_display = ('vm_id',)
search_fields = ('vm_id__vm_name',)
ordering = ('vm_id',)
filter_horizontal = ('license',)
admin.site.register(Vm_license, vm_license_admin)
如果没有主键,我还做了一个 oracle 触发器来自动增加主键,但我仍然遇到同样的错误。
CREATE OR REPLACE TRIGGER license_trigger
BEFORE INSERT ON vm_licenses
FOR EACH ROW
BEGIN
SELECT vm_license_seq.nextval
INTO :new.vm_license_id
FROM dual;
END;
为了更准确,我使用了一个多线程字段,当我在单击保存之前添加新项目并出现空错误时,它会正确显示,但是如果我转到现有项目,它会说表或视图不存在。
【问题讨论】:
标签: django django-models django-templates django-admin