【问题标题】:How to create django model without primary key column and avoiding Id default column如何创建没有主键列并避免 Id 默认列的 django 模型
【发布时间】:2019-03-12 17:14:31
【问题描述】:

我使用 SQL Server 作为默认数据库。我使用 inspectdb 命令复制了模型中的 SQL Server 表。现在,SQL Server 表没有任何主键列。因此,django 模型会自动创建 id 作为主键并在发布数据时给我错误。

列“id”不存在

是否有任何解决方法可以在移除 id 的同时不为模型的任何列定义主键?

from django.db import models

class ImptCustomer(models.Model):
    customerid = models.IntegerField(db_column='CustomerId', blank=True, null=True)  # Field name made lowercase.
    name = models.CharField(db_column='Name', max_length=50, blank=True, null=True)  # Field name made lowercase.
    phonenumber = models.CharField(db_column='PhoneNumber', max_length=20, blank=True, null=True)  # Field name made lowercase.
    emailaddress = models.CharField(db_column='EmailAddress', max_length=100, blank=True, null=True)  # Field name made lowercase.
    streetline = models.CharField(db_column='StreetLine', max_length=50, blank=True, null=True)  # Field name made lowercase.
    city = models.CharField(db_column='City', max_length=50, blank=True, null=True)  # Field name made lowercase.
    statecode = models.CharField(db_column='StateCode', max_length=5, blank=True, null=True)  # Field name made lowercase.
    postalcode = models.CharField(db_column='PostalCode', max_length=20, blank=True, null=True)  # Field name made lowercase.
    customer_key = models.IntegerField(db_column='Customer_Key', blank=True, null=True, editable = False)  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 'IMPT_Customer'

【问题讨论】:

  • 不能用customerid作为主键吗? SQL表怎么可能没有pk?
  • @dirkgroten 这是一个临时表,所以通常它没有任何主键。
  • 除非你有一个主键,否则 Django 模型将无法工作,这太单一了。不支持复合。一种解决方法可能是使用 Django.db 中的游标

标签: python sql-server django


【解决方案1】:

如果您没有明确定义主键,则 id 将成为您的主键。所以你不能那样做。

【讨论】:

  • 并且该 id 列必须存在于 SQL Server 数据库表中,对吗?但我无法更改表格并添加 id 列。无法修改表格。
【解决方案2】:

我猜它可以这样工作:

https://docs.djangoproject.com/en/2.1/topics/db/models/#automatic-primary-key-fields

from django.db import models

class ImptCustomer(models.Model):
    customerid = models.AutoField(primary_key=True, db_column='CustomerId')  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 'IMPT_Customer'

【讨论】:

  • 但在这种情况下,我不能将 customerid 设为 null 或重复
  • 我不知道你可以试试,但是如果你需要它为空/重复,你为什么要使用 id ......?太奇怪了。
【解决方案3】:

SQL 没有严格要求主键必须是唯一的,所以你可以做到这一点:

class ImptCustomer(models.Model):
    customerid = models.IntegerField(
        primary_key=True,
        unique=False,
        default=None,
        blank=True,
        null=True,
        db_column='CustomerId'
    )

当然,您必须手动为新记录生成主键值,但如果您已有包含数据的数据库,它可能只是它的单一解决方案。

【讨论】:

    【解决方案4】:

    这在 Django 的 ORM 中是不可能的:

    每个模型只需要一个字段来设置 primary_key=True(显式声明或自动添加)。

    (见here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多