2014-07-15 29 views
2

这个问题有一些限制。我们目前使用生产数据库和实时虚拟机统计数据。我们正在尝试创建一个django界面,它与我们希望我们的管理员能够编辑的表格进行交互。因此,迁移是不可能的,因为除非我了解迁移错误,否则会影响当前的数据库结构和/或数据。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_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触发器自动递增,如果有没有一个主键,但IM仍然得到同样的错误。

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; 

更percise我使用的是多对多场并正确显示当我转到点击保存和获取零误差前添加一个新的项目,但如果我转到现有项目,它会说表或视图不存在。

回答

0

我打算评论你的问题,但我还没有声望呢... 但我可以建议你发布你的相关admin.py代码吗?也许其中有一些与空PK错误有关的内容。

关于第二部分,ManyToManyField听起来更合适。

+0

我使用manytomany领域,当我去添加一个新的项目之前单击保存并获得空错误它将正确显示,但是当我去现有的项目时它说表或视图不存在使用多太多。 – PythonDevOps

+0

确定进行了更改 – PythonDevOps

+0

您的admin.py代码看起来很干净,所以我无法帮助您解决第一个问题,因为它超出了我的头。 你的第二个问题,我误解你已经有一个ManyToManyField。这应该在管理页面上创建一个'