【问题标题】:Django Custom Primary Key Tries to insert NullDjango 自定义主键尝试插入 Null
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 我正在使用 manytomany 字段,当我在单击保存之前添加一个新项目并出现空错误时,它将正确显示,但是当我转到现有项目时,它说 table 或 view 没有使用多对多时不存在。
    • 您的 admin.py 代码看起来很干净,所以我无法解决您的第一个问题,因为它超出了我的想象。你的第二个问题,我误读了你已经有一个 ManyToManyField。这应该在管理页面上创建一个<select>,属性为multiple="multiple"。这会将下拉选择框变成“选择列表”,然后您可以按住控件(在 Windows 上)选择列表中的多个项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 2018-02-10
    • 2021-10-01
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多