如何在没有主键列的情况下创建Django模型并避免使用ID默认列

时间:2019-03-12 17:14:32

标签: python sql-server django

我正在使用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'

3 个答案:

答案 0 :(得分:0)

如果您未明确定义主键,则ID成为您的主键。所以你不能那样做。

答案 1 :(得分:0)

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

  

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

(请参阅here

答案 2 :(得分:0)

SQL并没有严格要求主键必须唯一,因此可以做到这一点:

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

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