【问题标题】:django throws error: Invalid column name 'id' (SQL SERVER)django 抛出错误:无效的列名 'id' (SQL SERVER)
【发布时间】:2019-09-05 20:22:52
【问题描述】:

我尝试使用 django 创建一个 Web 应用程序并连接到 SQL Server 数据库。我用来以 django 形式显示数据的表由 2 列组成。它们都是外键,它们共同构建表的主键

创建表 [dbo].[MyTable]( [ID_Field1] [int] NOT NULL, [ID_Field2] [int] 非空,约束 [PK_Movies2Genres] PRIMARY 键集群([ID_Field1] ASC,[ID_Field2] ASC)与(PAD_INDEX = 关闭,STATISTICS_NORECOMPUTE = 关闭,IGNORE_DUP_KEY = 关闭, ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [主要]

ALTER TABLE [dbo].[MyTable] WITH CHECK ADD CONSTRAINT [FK_Field2] FOREIGN KEY([ID_Field2]) REFERENCES [dbo].[Table2] ([ID_Field2])

ALTER TABLE [dbo].[MyTable] 检查约束 [FK_Field2]

ALTER TABLE [dbo].[MyTable] WITH CHECK ADD CONSTRAINT [FK_Field1] FOREIGN KEY([ID_Field1]) REFERENCES [dbo].[Table1] ([ID_Movie])

ALTER TABLE [dbo].[MyTable] 检查约束 [FK_Field1]

现在,django 显然无法创建与这种 sql 表结构对应的模型,即它无法创建包含多个字段的主键。相反,它在 2 列之一和它设置的模型类的元部分中设置主键

unique_together = (('id_field1', 'id_field2'),)

完整模型:

类 MyTable(models.Model):

id_field1 = models.ForeignKey(Table1, on_delete=models.DO_NOTHING, db_column='ID_Field1') 
id_field2 = models.ForeignKey(Table2, on_delete=models.DO_NOTHING, db_column='ID_Field2')

class Meta:
    managed = False
    db_table = 'MyTable'
    unique_together = (('id_field1', 'id_field2'),)

但是,这是 django inspectdb 告诉我的。我知道当没有定义主键时,django 会自动创建一个名为 id 的字段。尽管定义了主键,但这里似乎就是这种情况。知道如何处理这个问题吗?

【问题讨论】:

    标签: django django-models django-forms django-templates django-views


    【解决方案1】:

    使用:https://github.com/onysos/django-composite-foreignkey

    class Customer(models.Model):
    
        company = models.IntegerField()
        customer_id = models.IntegerField()
        name = models.CharField(max_length=255)
        address = CompositeForeignKey(Address, on_delete=CASCADE, to_fields={
            "tiers_id": "customer_id",
            "company": LocalFieldValue("company"),
            "type_tiers": RawFieldValue("C")
        })
    
        class Meta(object):
            unique_together = [
                ("company", "customer_id"),
            ]
    
    
    class Contact(models.Model):
        company_code = models.IntegerField()
        customer_code = models.IntegerField()
        surname = models.CharField(max_length=255)
        # virtual field
        customer = CompositeForeignKey(Customer, on_delete=CASCADE, related_name='contacts', to_fields={
            "customer_id": "customer_code",
            "company": "company_code"
        })
    

    【讨论】:

    • 如果 customer_id 与模型 Customer 和 company 将与模型 Company 相关,我将如何定义 CompositeForeignKey? CompositeForeignKey 只接受一个模型作为参数,对吧?
    • 对不起,我不知道!我和你有同样的问题,CompositeForeignKey 对我来说不是最好的解决方案,我把它停了,我正在消除公司的其他火灾。如果你有消息,请告诉我!
    • 我的解决方法只是添加另一个 id 字段。我对这个解决方案不太满意,但 django 似乎不支持这种模型结构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    相关资源
    最近更新 更多